172

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

4

18 回答 18

299

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

const newArray = array.map(({dropAttr1, dropAttr2, ...keepAttrs}) => keepAttrs)
于 2017-10-19T21:47:01.563 回答
162

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

例如 :

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

笔记:

  • 如果你想与 IE8 兼容,你需要一个用于 forEach 的 shim。正如您提到的原型,prototype.js 也有一个 shim
  • delete是最糟糕的“优化杀手”之一。使用它通常会破坏应用程序的性能。如果您想真正删除某个属性,则无法避免它,但您通常可以将属性设置为undefined或仅构建没有该属性的新对象。
于 2013-08-08T18:42:24.213 回答
28

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

array.map(function(item) { 
    delete item.bad; 
    return item; 
});
于 2015-11-18T09:50:43.663 回答
16

如果您使用underscore.js

var strippedRows = _.map(rows, function (row) {
    return _.omit(row, ['bad', 'anotherbad']);
});
于 2016-02-09T18:42:17.393 回答
10

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

array.map(({good}) => ({good}))
于 2019-01-14T12:29:47.293 回答
10

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

data.map((datum) => {
  return {
    'id':datum.id,
    'title':datum.login
  }
});
于 2020-08-27T07:46:00.187 回答
8

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

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;
于 2013-08-08T18:47:31.837 回答
4

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

const cleanArray = array.map(item=>{
  delete item.bad
  return item
})
console.log(cleanArray)

于 2021-10-26T13:50:35.173 回答
3

ES6 中最短的方法:

array.forEach(e => {delete e.someKey});
于 2020-11-09T16:47:26.840 回答
2

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

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

它仍然不够完美,但保持了一定程度的不变性,并且可以灵活地命名要删除的多个属性。(欢迎提出建议)

于 2020-01-03T20:29:43.623 回答
1

我建议Object.assignforEach()循环中使用,以便复制对象并且不影响原始对象数组

var res = [];
array.forEach(function(item) { 
    var tempItem = Object.assign({}, item);
    delete tempItem.bad; 
    res.push(tempItem);
});
console.log(res);
于 2018-12-13T07:15:28.000 回答
1

ES6:

const newArray = array.map(({keepAttr1, keepAttr2}) => ({keepAttr1, newPropName: keepAttr2}))
于 2021-01-07T16:49:42.387 回答
1

这对我很有效!

export function removePropertiesFromArrayOfObjects(arr = [], properties = []) {
return arr.map(i => {
    const newItem = {}
    Object.keys(i).map(key => {
        if (properties.includes(key)) { newItem[key] = i[key] }
    })
    return newItem
})
}
于 2021-03-05T19:05:56.417 回答
1

通过减少:

const newArray = oldArray.reduce((acc, curr) => {
  const { remove_one, remove_two, ...keep_data } = curr;
  acc.push(keep_data);
  return acc;
}, []);
于 2021-10-26T13:21:02.680 回答
0
const arr = [
  {id: 1, name: 'user1', test: 'abc'},
  {id: 2, name: 'user2', test: 'xyz'},
];

const newArr = arr.map(({test, ...rest}) => {
  return rest;
});

console.log(newArr);
// ️ [{id: 1, name: 'User1'},  {id: 2, name: 'User2'}]

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

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

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

const arr = [
  {id: 1, name: 'Tom', test: 'abc'},
  {id: 2, name: 'Bob', test: 'xyz'},
];

arr.forEach(object => {
  delete object['test'];
});

console.log(arr);
// ️ [{id: 1, name: 'Tom'}, {id: 2, name: 'Bob'}]
于 2020-08-18T09:31:11.433 回答
-1

我尝试在不删除 Vue.js 中的列的情况下创建一个新对象。

let data =this.selectedContactsDto[];

//selectedContactsDto[] = 带有在我的项目中创建的数组对象列表的对象

控制台.log(数据);让 newDataObj= data.map(({groupsList,customFields,firstname, ...item }) => item); console.log("newDataObj",newDataObj);

于 2020-04-16T07:21:43.507 回答
-1

那里有很多图书馆。这完全取决于您的数据结构有多复杂(例如考虑深度嵌套的键)

我们喜欢对象字段,因为它也适用于深度嵌套的层次结构(为 api 字段参数构建)。这是一个简单的代码示例

// const objectFields = require('object-fields');

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

const retain = objectFields.Retainer(['good']);
retain(array);
console.log(array);
// => [ { good: 'something' }, { good: 'something' } ]
.as-console-wrapper {max-height: 100% !important; top: 0}
<script src="https://bundle.run/object-fields@2.0.19"></script>

免责声明:我是对象字段的作者

于 2020-11-18T06:06:22.613 回答
-5

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

于 2018-04-01T21:19:54.347 回答