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

时间:2013-08-08 18:40:54

标签: javascript performance

我想从数组中的每个对象中删除“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;
}

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

16 个答案:

答案 0 :(得分:70)

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

例如:

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

请注意,如果您想与IE8兼容,则需要a shim for forEach。当你提到原型时,prototype.js也是has a shim

答案 1 :(得分:42)

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

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

答案 2 :(得分:14)

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

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

答案 3 :(得分:9)

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

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;

答案 4 :(得分:9)

如果您使用underscore.js

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

答案 5 :(得分:1)

您可以按照以下操作进行操作,因为没有找到密钥,因此可读性更高,而不是期望值升高:

# ip4 network
59.9.52.0/24 -allowed
59.9.52.0/29 -allowed
59.9.52.0/21 -not allowed, < 24


#ip6 network
2001:db8::1000/122 -allowed
2001:db8::1000/127 -allowed
2001:db8::1000/100 -not allowed, < 120

答案 6 :(得分:1)

ES6:

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

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

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

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

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

答案 9 :(得分:0)

我尝试创建一个新对象而不删除Vue.js中的同伴。

let data =this.selectedContactsDto[];

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

console.log(数据); 让newDataObj = data.map(({{groupsList,customFields,firstname,... item})=> item); console.log(“ newDataObj”,newDataObj);

答案 10 :(得分:0)

要删除某些键值对表单对象数组,请使用 Postgres SQL 作为数据库,如下例所示:

这是用户函数,返回用户详细信息对象,我们必须从行中删除“ api_secret”键:

    function getCurrentUser(req, res, next) { // user function
    var userId = res.locals.userId;
    console.log(userId)
    db.runSQLWithParams("select * from users where id = $1", [userId], function(err, rows) {
      if(err){
        console.log(err)
      }
      var responseObject = {
        _embedded: rows,
      }
      responseObject._embedded[0].api_secret = undefined
      // console.log(api);
      // console.log(responseObject);
      res.json(responseObject);
    }); 
}

上面的函数将下面的对象作为JSON响应之前返回

 {
    "_embedded": [
        {
            "id": "0123abd-345gfhgjf-dajd4456kkdj",
            "secret_key: "secret",
            "email": "abcd@email.com",
            "created": "2020-08-18T00:13:16.077Z"
        }
    ]
}

添加此行responseObject._embedded[0].api_secret = undefined之后,它给出以下结果作为JSON响应:

{
        "_embedded": [
            {
                "id": "0123abd-345gfhgjf-dajd4456kkdj",
                "email": "abcd@email.com",
                "created": "2020-08-18T00:13:16.077Z"
            }
        ]
    }

答案 11 :(得分:0)

ES6中最短的方法:

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

答案 12 :(得分:0)

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

我们喜欢object-fields,因为它也可用于深度嵌套的层次结构(为api字段构建参数)。基于object-scan,所以您知道它很快。这是一个简单的代码示例

a[10+1]

答案 13 :(得分:0)

这对我很有效!

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

}

答案 14 :(得分:-1)

我认为这是最简单的变体

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

答案 15 :(得分:-2)

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