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


106

我想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,或其他方式。我不知道。有想法吗?


1
没关系,其他方法获得的线性O(n)都不能少。无论您使用什么,都将需要访问所有数组元素
Brian

原型?那将有什么帮助?还是所有这些具有相同构造函数的对象实例都共享一个公共值bad
Bergi

1
@Bergi我想知道他们是指原型ArrayJS还是原型,这些原型都是不良的表现
Ian

我不确定在循环之前是否应该将array.length存储在变量中。我敢肯定,如果您进行简介,那将是不值得的。
DenysSéguret13年

1
@ZackArgyle是的,在一般情况下并没有更快的速度。
DenysSéguret13年

Answers:


117

唯一的其他方法是修饰,实际上是循环。

例如 :

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

笔记:

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

1
如果允许循环“伪造”循环,也不会比循环好多少:Pfor(var i = 0; i < array.length ) delete array[i].bad
Esailija

1
@Esailija取决于。我喜欢使用它,forEach因为我发现代码更具表现力(并且很早以前就不再担心IE)。
DenysSéguret13年

1
他们都没有以根本不同的方式表达“删除此数组中所有对象的不良特性”。forEach是通用的,本身就没有语义上的意义,就像一个for循环。
Esailija

1
@Esailija我同意。这就是为什么我认为它是“化妆品”的原因。我的答案不清楚吗?
DenysSéguret13年

不幸的。我坚持使用for循环,该循环通常比forEach更快。真的...谁在乎IE8。谢谢您的帮助。
Zack Argyle

166

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

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

16
适用于最初的问题可能是const newArray = array.map(({ bad, ...item }) => item);
dhilt

1
强烈建议这样做,因为它不会修改原始数组(不可变的操作)
Pizzicato

1
这应该是可接受的答案,因为它返回一个新数组,而不是覆盖现有数组。
user1275105

好的答案,但是如果属性名称包含dot(。),例如“ bad.prop”,则无法正常工作
Yayati

@Amiraslan我会用// eslint-disable-next-line no-unused-vars
piotr_cz

20

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

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

11
请注意,这会改变原始数组
piotr_cz

1
在此特殊情况下,return无需明确声明
Sandeep Kumar,

4
array.forEach(v => delete v.bad);
Anthony Awuley,

14

如果您使用underscore.js

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

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;

3

我认为这是最简单的变体

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

3
问题是关于消除坏处,而不是保留好处。如果您的对象有10个字段要保留,而一个字段要删除,那么上面的字段将很难输入。
艾德里安


0

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

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

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

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


0

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

let data =this.selectedContactsDto[];

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

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


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

-4

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


您能解释一下您的解决方案吗?
sg7

Map是JavaScript ES6中的新数据结构。附加链接可能会对您有所帮助。hackernoon.com/what-you-should-know-about-es6-maps-dc66af6b9a1e
hk_y

如果您的物品中有很多道具,则此解决方案不是很好。
Koop4 '18 -4-18

是! 试图提供不同的方法。
hk_y
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.