Подтвердить что ты не робот

Удалить свойство для всех объектов в массиве

Я хочу удалить свойство 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 или что-то в этом роде. Я не знаю. Идеи?

4b9b3361

Ответ 1

Единственные другие способы являются косметическими и фактически являются петлями.

Например:

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

Примечание:

  • если вы хотите быть совместимым с IE8, вам понадобится прокладка для forEach. Как вы упомянули про прототип, prototype.js также имеет прокладку.
  • delete является одним из худших "убийц оптимизации". Его использование часто нарушает производительность ваших приложений. Этого нельзя избежать, если вы действительно хотите удалить свойство, но вы часто можете либо установить для свойства значение undefined, либо просто построить новый объект без свойства.

Ответ 2

С ES6 вы можете деконструировать каждый объект для создания нового без именованных атрибутов:

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

Ответ 3

Я предпочитаю использовать карту для удаления свойства и затем возвращать новый элемент массива.

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

Ответ 4

Решение, использующее прототипы, возможно только в том случае, если ваши объекты одинаковы:

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;

Ответ 5

Если вы используете underscore.js:

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

Ответ 6

Я предлагаю использовать Object.assign в Object.assign forEach() чтобы объекты копировались и не влияли на исходный массив объектов.

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

Ответ 7

На мой взгляд, это самый простой вариант

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

Ответ 8

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));