我想从数组中的每个对象中删除
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
之类的东西。我不知道。有想法吗?
使用 ES6,您可以解构每个对象来创建没有命名属性的新对象:
const newArray = array.map(({dropAttr1, dropAttr2, ...keepAttrs}) => keepAttrs)
唯一的其他方式是装饰性的,实际上是循环。
例如:
array.forEach(function(v){ delete v.bad });
备注:
delete
是最糟糕的“优化杀手”之一。使用它通常会破坏应用程序的性能。如果您想真正删除某个属性,则无法避免它,但您通常可以将该属性设置为 undefined
或仅构建没有该属性的新对象。我更喜欢使用map删除属性,然后返回新的数组项。
array.map(function(item) {
delete item.bad;
return item;
});
您可以按照此操作,更具可读性,而不是由于找不到密钥而提高期望:
data.map((datum) => {
return {
'id':datum.id,
'title':datum.login
}
});
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 方法的函数会被数组中的每个元素调用。
我们解构每个对象的测试属性,并使用剩余运算符 (...) 来获取对象的其余属性。
我们从函数中返回对象的其余属性,实际上不包括测试属性。
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'}]
如果你使用underscore.js:
var strippedRows = _.map(rows, function (row) {
return _.omit(row, ['bad', 'anotherbad']);
});
我认为这是最简单的变体
array.map(({good}) => ({good}))
只有当您的对象相似时,使用原型的解决方案才是可能的:
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;
var array = [{"bad": "something", "good":"something"},{"bad":"something", "good":"something"}];
const cleanArray = array.map(item=>{
delete item.bad
return item
})
console.log(cleanArray)
ES6 中最短路线:
array.forEach(e => {delete e.someKey});
这个问题现在有点老了,但我想提供一种替代解决方案,不会改变源数据并且需要最少的手动工作:
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", ]));
它仍然不够完美,但保持了一定程度的不变性,并且可以灵活地命名要删除的多个属性。 (欢迎建议)
我建议在
Object.assign
循环中使用 forEach()
,以便复制对象并且不会影响原始对象数组
var res = [];
array.forEach(function(item) {
var tempItem = Object.assign({}, item);
delete tempItem.bad;
res.push(tempItem);
});
console.log(res);
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
})
}
那里有很多图书馆。这完全取决于您的数据结构的复杂程度(例如考虑深度嵌套的键)
我们喜欢 object-fields,因为它也适用于深度嵌套的层次结构(为 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/[email protected]"></script>
免责声明:我是object-fields
的作者减少:
const newArray = oldArray.reduce((acc, curr) => {
const { remove_one, remove_two, ...keep_data } = curr;
acc.push(keep_data);
return acc;
}, []);
如果您使用 underscore.JS 库:
let asdf = [{"asd": 12, "asdf": 123}, {"asd": 121, "asdf": 1231}, {"asd": 142, "asdf": 1243}]
_.map(asdf, function (row) {
return _.omit(row, ['asd'])
})
用于删除对象数组中所有对象的属性的通用函数:
/**
* Returns the array of objects without the indicated property.
* @param {array} arrayOfObjects
* @param {string} property
* @returns {array}
* @see https://stackoverflow.com/a/69723902 remove property from an array of objects
* @see https://github.com/airbnb/javascript#objects--rest-spread new object with certain properties omitted
*/
const removePropertyFromArrayOfObjects = (arrayOfObjects, property) => {
return arrayOfObjects.reduce((accumulator, currentValue) => {
const {[property]: _new_name_, ...keep_data} = currentValue;
accumulator.push(keep_data);
return accumulator;
}, []);
};
// Example of use:
const array = [{"bad": "something", "good": "something"}, {"bad": "something", "good": "something"}];
console.log(removePropertyFromArrayOfObjects(array, "bad"));
// Expected output: Array [Object { good: "something" }, Object { good: "something" }]
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));