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

我想从数组中的每个对象中删除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之类的。我不知道。想法吗?

191680 次浏览

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

例如:

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

注:

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

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

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;

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

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

如果你使用underscore.js:

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

在ES6中,你可以分解每个对象来创建一个没有命名属性的新对象:

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

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

我将建议在forEach()循环中使用Object.assign,这样对象就会被复制,并且不会影响原始的对象数组

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

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

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

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

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

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

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

let data =this.selectedContactsDto[];

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

< p > console.log(数据); let newDataObj= data。地图({groupsList customFields, firstname,……Item}) => Item); console.log(“newDataObj”,newDataObj); < / p >
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'}]

传递给数组的函数。Map方法被数组中的每个元素调用。

我们从每个对象中解构test属性,并使用rest操作符(…)来获得对象的其余属性。

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

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'}]

你可以这样做,更可读,而不是期望提高,因为没有找到关键字:

data.map((datum) => {
return {
'id':datum.id,
'title':datum.login
}
});

ES6中最短的方法:

array.forEach(e => {delete e.someKey});

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

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

// 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>

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

ES6:

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

这对我来说很有效!

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

通过减少:

const newArray = oldArray.reduce((acc, curr) => {
const { remove_one, remove_two, ...keep_data } = curr;
acc.push(keep_data);
return acc;
}, []);

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


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