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

问题描述 投票:0回答:19

我想从数组中的每个对象中删除

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
之类的东西。我不知道。有想法吗?

javascript javascript-objects
19个回答
427
投票

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

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

185
投票

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

例如:

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

备注:

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

34
投票

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

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

23
投票

您可以按照此操作,更具可读性,而不是由于找不到密钥而提高期望:

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

19
投票
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'}]

17
投票

如果你使用underscore.js:

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

10
投票

我认为这是最简单的变体

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

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;

8
投票

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

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


3
投票

ES6 中最短路线:

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

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

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


1
投票

我建议在

Object.assign
循环中使用
forEach()
,以便复制对象并且不会影响原始对象数组

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

1
投票

ES6:

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

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

0
投票

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

我们喜欢 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

的作者

0
投票

减少:

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

0
投票

如果您使用 underscore.JS 库:

let asdf = [{"asd": 12, "asdf": 123}, {"asd": 121, "asdf": 1231}, {"asd": 142, "asdf": 1243}]


_.map(asdf, function (row) {
    return _.omit(row, ['asd'])
})

0
投票

用于删除对象数组中所有对象的属性的通用函数:

/**
 * 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" }]


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

© www.soinside.com 2019 - 2024. All rights reserved.