我想从数组中的每个对象中删除坏属性。有没有比使用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;
}

似乎应该有一种方法来使用原型之类的。我不知道。想法吗?


当前回答

ES6:

const newArray = array.map(({keepAttr1, keepAttr2}) => ({keepAttr1, newPropName: keepAttr2}))

其他回答

其他唯一的方法是表面上的,实际上是循环。

例如:

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

注:

如果你想要兼容IE8,你需要为forEach准备一个垫片。正如你提到的prototype, prototype.js也有一个垫片。 删除是最糟糕的“优化杀手”之一。使用它通常会破坏应用程序的性能。如果你真的想要删除一个属性,你无法避免它,但你通常可以将属性设置为undefined,或者只是构建不带属性的新对象。

我建议使用Object。在forEach()循环中赋值,以便对象被复制并且不会影响原始对象数组

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

我更喜欢使用map删除属性,然后返回新的数组项。

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

这个问题现在有点老了,但我想提供一个替代解决方案,它不会改变源数据,并且只需要最少的手工工作:

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", ]));

它仍然不是完美的,但是保持了某种程度的不可变性,并且可以灵活地命名您想要删除的多个属性。(建议欢迎)

数组var =[{“坏”:“东西”,“好”:“东西”},{“坏”:“东西”,“好”:“东西”}); Var结果= array.map(函数(项){ 返回{good: item["good"]} }); console.log (JSON.stringify(结果));