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

Zac*_*yle 64 javascript javascript-objects

我想从数组中的每个对象中删除"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;
}
Run Code Online (Sandbox Code Playgroud)

看起来似乎应该有一种方法来使用原型或其他东西.我不知道.想法?

Den*_*ret 80

唯一的其他方式是化妆品,实际上是循环.

例如 :

array.forEach(function(v){ delete v.bad });
Run Code Online (Sandbox Code Playgroud)

请注意,如果您想与IE8兼容,则需要forEach的垫片.当你提到原型时,prototype.js也有一个垫片.


pio*_*_cz 74

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

const newArray = array.map(({dropAttr1, dropAttr2, ...keepAttrs}) => keepAttrs)
Run Code Online (Sandbox Code Playgroud)

  • 适用于最初的问题可能是const newArray = array.map(({bad,... item})=&gt; item);` (6认同)
  • 这是非常推荐的,因为它不会修改原始数组(不可变操作) (2认同)
  • 这应该是可接受的答案,因为它返回一个新数组,而不是覆盖现有数组。 (2认同)
  • @ИгорТашевски `.map(({ [prop]: _, ...keep }) =&gt; keep)` (2认同)

aks*_*hir 21

const arr = [\n  {id: 1, name: 'user1', test: 'abc'},\n  {id: 2, name: 'user2', test: 'xyz'},\n];\n\nconst newArr = arr.map(({test, ...rest}) => {\n  return rest;\n});\n\nconsole.log(newArr);\n// \xef\xb8\x8f [{id: 1, name: 'User1'},  {id: 2, name: 'User2'}]\n
Run Code Online (Sandbox Code Playgroud)\n

我们传递给 Array.map 方法的函数会被数组中的每个元素调用。

\n

我们解构每个对象的测试属性,并使用其余运算符 (...) 来获取对象的其余属性。

\n

我们从函数中返回对象的其余属性,实际上不包括测试属性。

\n
const arr = [\n  {id: 1, name: 'Tom', test: 'abc'},\n  {id: 2, name: 'Bob', test: 'xyz'},\n];\n\narr.forEach(object => {\n  delete object['test'];\n});\n\nconsole.log(arr);\n// \xef\xb8\x8f [{id: 1, name: 'Tom'}, {id: 2, name: 'Bob'}]\n
Run Code Online (Sandbox Code Playgroud)\n


ex0*_*b1t 18

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

array.map(function(item) { 
    delete item.bad; 
    return item; 
});
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这会改变原始数组 (9认同)
  • `array.forEach(v =&gt; 删除 v.bad);` (5认同)
  • 在这种特殊情况下,不需要显式的“return”语句 (2认同)

Ber*_*rgi 9

只有当您的对象相似时,才能使用原型解决方案:

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

但那么它很简单(和O(1)):

delete Cons.prototype.bad;
Run Code Online (Sandbox Code Playgroud)


Cod*_*ody 9

如果你使用underscore.js:

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


小智 9

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

array.map(({good}) => ({good}))
Run Code Online (Sandbox Code Playgroud)

  • 问题是去除坏的,而不是保留好的。如果您的对象有 10 个要保留的字段和一个要删除的字段,那么上面的内容就会变得很长。 (12认同)

Syl*_*ain 8

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

const cleanArray = array.map(item=>{
  delete item.bad
  return item
})
console.log(cleanArray)
Run Code Online (Sandbox Code Playgroud)


Mai*_*sad 6

您可以遵循这个,更具可读性,而不是由于找不到密钥而提高期望值:

data.map((datum) => {
  return {
    'id':datum.id,
    'title':datum.login
  }
});
Run Code Online (Sandbox Code Playgroud)