배열의 모든 객체에 대한 속성 제거


110

bad배열의 모든 개체에서 속성 을 제거하고 싶습니다 . for루프를 사용하고 모든 객체에서 삭제 하는 것보다 더 좋은 방법이 있습니까?

var array = [{"bad": "something", "good":"something"},{"bad":"something", "good":"something"},...];

for (var i = 0, len = array.length; i < len; i++) {
  delete array[i].bad;
}

을 사용하는 방법이 있어야 할 것 같습니다 prototype. 모르겠어요. 아이디어?


1
중요하지 않습니다. 다른 방법은 선형 O (n)보다 작을 수 없습니다. 무엇을 사용하든 모든 배열 요소에 액세스해야합니다
Brian

원기? 그게 어떻게 도움이 될까요? 아니면 모든 객체가 동일한 생성자의 인스턴스이며에 대한 공통 값을 공유 bad합니까?
Bergi

1
@Bergi 나는 그들이 prototypeJS 또는 Arraydystroy가 예시 한 프로토 타입을 언급하고 있는지 궁금합니다
Ian

루핑하기 전에 array.length를 변수에 저장 해야할지 모르겠습니다. 프로필을 작성하면 고통의 가치가 없다는 것을 알게 될 것입니다.
Denys Séguret 2013-08-08

1
@ZackArgyle 예, 일반적으로 더 빠른 것은 없습니다.
Denys Séguret 2013 년

답변:


120

유일한 다른 방법은 외형이며 실제로 루프입니다.

예 :

array.forEach(function(v){ delete v.bad });

메모:

  • IE8과 호환되기를 원한다면 forEach에 대한 shim이 필요 합니다 . 프로토 타입을 언급했듯이 prototype.js에도 shim이 있습니다.
  • delete최악의 "최적화 킬러" 중 하나입니다 . 자주 사용하면 응용 프로그램의 성능이 저하됩니다. 실제로 속성을 제거하려는 경우에는 피할 수 없지만 속성을로 설정하거나 속성 undefined없이 새 객체를 빌드 할 수 있습니다.

1
루프가 될 수있는 경우별로 더 루프보다 "가짜"온을 너무 줄 지어 : Pfor(var i = 0; i < array.length ) delete array[i].bad
Esailija

1
@Esailija는 다릅니다. 나는 forEach코드가 더 표현력이 있다는 것을 알았 기 때문에 사용하는 것을 좋아합니다 (그리고 오래 전에 IE에 대해 걱정하지 않았기 때문에).
Denys Séguret 2013 년

1
둘 다 근본적으로 다른 방식으로 "이 배열에있는 모든 객체의 잘못된 속성 삭제"를 표현하지 않습니다. 루프 forEach처럼 일반적이고 의미 상 그 자체로는 의미가 없습니다 for.
Esailija

1
@Esailija 동의합니다. 그것이 내가 "화장품"이라고 정한 이유입니다. 내 대답에 명확하지 않습니까?
Denys Séguret 2013 년

불행한 사람. 일반적으로 forEach보다 빠른 for 루프를 고수하겠습니다. 그리고 정말로 ... IE8에 관심이있는 사람. 도와 주셔서 감사합니다.
Zack Argyle

173

ES6를 사용하면 각 개체를 분해하여 명명 된 속성없이 새 개체를 만들 수 있습니다.

const newArray = array.map(({dropAttr1, dropAttr2, ...keepAttrs}) => keepAttrs)

16
초기 문제에 적용하면 될 수 있습니다const newArray = array.map(({ bad, ...item }) => item);
dhilt

1
이것은 매우는 (불변 작업을) 원래의 배열은 수정되지 않기 때문에 권장
피치카토

1
이것은 기존 배열을 덮어 쓰는 대신 새 배열을 반환하기 때문에 허용되는 대답이어야합니다.
user1275105

속성 이름 도트가 포함되어있는 경우 작업 훌륭한 대답하지만 예를 들어 'bad.prop'(.)
야야 티

@Amiraslan I 'd use// eslint-disable-next-line no-unused-vars
piotr_cz

20

맵을 사용하여 속성을 삭제 한 다음 새 배열 항목을 반환하는 것을 선호합니다.

array.map(function(item) { 
    delete item.bad; 
    return item; 
});

12
이것은 원래 배열을 변경합니다
piotr_cz

1
이 특별한 경우 명시 적 return문장은 필요하지 않을 것입니다
샌딥 쿠마르

4
array.forEach(v => delete v.bad);
Anthony Awuley

14

underscore.js 를 사용하는 경우 :

var strippedRows = _.map(rows, function (row) {
    return _.omit(row, ['bad', 'anotherbad']);
});

9

프로토 타입을 사용하는 솔루션은 객체가 비슷할 때만 가능합니다.

function Cons(g) { this.good = g; }
Cons.prototype.bad = "something common";
var array = [new Cons("something 1"), new Cons("something 2"), …];

그러나 그것은 간단합니다 (그리고 O(1)) :

delete Cons.prototype.bad;

3

제 생각에는 이것은 가장 간단한 변형입니다

array.map(({good}) => ({good}))

3
문제는 좋은 것을 유지하는 것이 아니라 나쁜 것을 제거하는 것이 었습니다. 개체에 유지할 필드가 10 개 있고 제거 할 필드가 하나 있으면 위의 내용을 입력하는 데 정말 길어집니다.
adrien

1

키를 찾을 수 없기 때문에 기대하지 않고 더 읽기 쉽고 다음을 수행 할 수 있습니다.

data.map((datum)=>{
                    return {
                        'id':datum.id,
                        'title':datum.login,
                    }

0

객체가 복사되고 객체의 원래 배열에 영향을 미치지 않도록 루프 Object.assign내 에서 사용 하는 것이 좋습니다.forEach()

var res = [];
array.forEach(function(item) { 
    var tempItem = Object.assign({}, item);
    delete tempItem.bad; 
    res.push(tempItem);
});
console.log(res);

0

이 질문은 현재 약간 오래되었지만 소스 데이터를 변경하지 않고 최소한의 수동 노력이 필요한 대체 솔루션을 제공하고 싶습니다.

function mapOut(sourceObject, removeKeys = []) {
  const sourceKeys = Object.keys(sourceObject);
  const returnKeys = sourceKeys.filter(k => !removeKeys.includes(k));
  let returnObject = {};
  returnKeys.forEach(k => {
    returnObject[k] = sourceObject[k];
  });
  return returnObject;
}

const array = [
  {"bad": "something", "good":"something"},
  {"bad":"something", "good":"something"},
];

const newArray = array.map(obj => mapOut(obj, [ "bad", ]));

여전히 완벽하지는 않지만 일정 수준의 불변성을 유지하고 제거하려는 여러 속성의 이름을 지정할 수있는 유연성이 있습니다. (제안 환영)


0

Vue.js에서 coulmns를 삭제하지 않고 새 개체를 craeting 시도했습니다.

let data =this.selectedContactsDto[];

// selectedContactsDto [] = 내 프로젝트에서 생성 된 배열 개체 목록이있는 개체

console.log (데이터); let newDataObj = data.map (({groupsList, customFields, firstname, ... item}) => item); console.log ( "newDataObj", newDataObj);


0

일부 키 값 쌍 양식 객체 배열을 제거하려면 다음 예제와 같이 Postgres SQL 을 데이터베이스로 사용합니다 .

이것은 사용자 함수 반환 사용자 세부 정보 객체입니다. 행에서 "api_secret"키를 제거해야합니다.

    function getCurrentUser(req, res, next) { // user function
    var userId = res.locals.userId;
    console.log(userId)
    db.runSQLWithParams("select * from users where id = $1", [userId], function(err, rows) {
      if(err){
        console.log(err)
      }
      var responseObject = {
        _embedded: rows,
      }
      responseObject._embedded[0].api_secret = undefined
      // console.log(api);
      // console.log(responseObject);
      res.json(responseObject);
    }); 
}

위의 함수는 이전에 JSON 응답으로 객체 아래를 반환합니다.

 {
    "_embedded": [
        {
            "id": "0123abd-345gfhgjf-dajd4456kkdj",
            "secret_key: "secret",
            "email": "abcd@email.com",
            "created": "2020-08-18T00:13:16.077Z"
        }
    ]
}

이 줄을 추가하면 responseObject._embedded[0].api_secret = undefinedJSON 응답으로 아래 결과를 제공합니다.

{
        "_embedded": [
            {
                "id": "0123abd-345gfhgjf-dajd4456kkdj",
                "email": "abcd@email.com",
                "created": "2020-08-18T00:13:16.077Z"
            }
        ]
    }

0

ES6에서 가장 짧은 방법 :

array.forEach(e => {delete e.someKey});

-4

var array = [{"bad": "something", "good":"something"},{"bad":"something", "good":"something"}];
var results = array.map(function(item){
  return {good : item["good"]}
});
console.log(JSON.stringify(results));


해결책을 설명해 주시겠습니까?
sg7

Map은 JavaScript ES6의 새로운 데이터 구조입니다. 첨부 된 링크가 도움이 될 수 있습니다. hackernoon.com/what-you-should-know-about-es6-maps-dc66af6b9a1e
hk_y

아이템에 소품이 많으면이 솔루션은 좋지 않습니다.
Koop4 2014

예! 다른 접근 방식을 제공하려고했습니다.
hk_y
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.