删除数组中所有对象的属性

IT技术 javascript javascript-objects
2021-01-17 06:10:02

我想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,或其他东西。我不知道。想法?

6个回答

使用 ES6,您可以解构每个对象以创建没有命名属性的新对象:

const newArray = array.map(({dropAttr1, dropAttr2, ...keepAttrs}) => keepAttrs)
应用于最初的问题可能是 const newArray = array.map(({ bad, ...item }) => item);
2021-03-17 06:10:02
这应该是公认的答案,因为它返回一个新数组,而不是覆盖现有数组。
2021-03-26 06:10:02
如果道具是动态的怎么办?你需要即时删除它吗?
2021-03-27 06:10:02
@ИгорТашевски .map(({ [prop]: _, ...keep }) => keep)
2021-03-27 06:10:02
这是非常推荐的,因为它不会修改原始数组(不可变操作)
2021-04-03 06:10:02

唯一的其他方式是装饰性的,实际上是循环。

例如 :

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

笔记:

  • 如果你想与 IE8 兼容,你需要一个 forEach 的垫片正如你提到的原型,prototype.js 也有一个 shim
  • delete是最糟糕的“优化杀手”之一使用它通常会破坏应用程序的性能。如果您想真正删除属性,则无法避免它,但您通常可以将属性设置为undefined或仅构建没有该属性的新对象。
如果允许循环是“假的”,也不会比循环好多少-也有内衬:P for(var i = 0; i < array.length ) delete array[i].bad
2021-03-18 06:10:02
它们都没有以完全不同的方式表达“删除此数组中所有对象的坏属性”。forEach本身是通用的并且在语义上没有意义,就像一个for循环。
2021-03-20 06:10:02
@Esalija 视情况而定。我喜欢使用forEach是因为我发现代码更具表现力(并且因为我很久以前就不再担心 IE)。
2021-03-22 06:10:02
@Esalija 我同意。这就是为什么我精确地说它是“化妆品”。我的回答不是很清楚吗?
2021-03-23 06:10:02
不幸的。我将坚持使用通常比 forEach 更快的 for 循环。真的......谁在乎IE8。谢谢您的帮助。
2021-03-24 06:10:02

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

array.map(function(item) { 
    delete item.bad; 
    return item; 
});
请注意,这会改变原始数组
2021-03-16 06:10:02
在这种特殊情况下,return不需要显式声明
2021-03-16 06:10:02
array.forEach(v => delete v.bad);
2021-03-29 06:10:02

如果你使用underscore.js

var strippedRows = _.map(rows, function (row) {
    return _.omit(row, ['bad', 'anotherbad']);
});
_.omit 据我所知,正在 Lodash v5 中删除
2021-03-12 06:10:02

在我看来,这是最简单的变体

array.map(({good}) => ({good}))
问题是去除坏的,而不是保留好的。如果您的对象有 10 个要保留的字段和一个要删除的字段,那么上面的内容就会变得很长。
2021-03-24 06:10:02