使用java脚本从对象中删除项目的更好方法是什么

时间:2018-03-08 11:24:45

标签: javascript performance javascript-objects

我有50000行和200列(每行)并尝试从每个行对象中删除所有col对象,现在需要5秒钟才能完成整个过程。有没有更好的方法来提高性能? 注意:有可能跳过一些对象,在这种情况下不要删除skipRows和skipCols对象。

var skipRows = {10:1,11:1,12:1,13:1,14:1,15:1,16:1,17:1,18:1,19:1,20:1};
var skipCols = {50:1,51:1,52:1,53:1,54:1,55:1,56:1,57:1,58:1,59:1,60:1};

for(var i = 0; i < 50000; i++){
   if(!(i in skipRows)){
    var rowObject = rowColObjects[i];
     for  ( var j = 0; j < 200; j++){
        if(!(j in skipCols)){
          delete rowObject[i+"-"+j];
        }
     } 
  }

}

下面的

是查看示例代码和结果的小提琴:

http://jsfiddle.net/rambabu14/9mcne3en/

谢谢, Rambabu。

4 个答案:

答案 0 :(得分:1)

为什么不重新初始化它,而不是遍历所有键并删除它们。

rowColObjects = {};

在此处查看效果http://jsfiddle.net/9mcne3en/3/

答案 1 :(得分:0)

如果要从删除中跳过某些对象,则

for(var i = 0; i < 50000; i++){
   var rowObject = rowColObjects[i];
   if (condition)
   {
      rowObject = {};
   }
}

答案 2 :(得分:0)

在我的浏览器(当前最新的Firefox)中,您的原始代码大约需要14秒。然后,我尝试使用我的代码,大约需要6秒。至少,我的代码改善了执行时间。

const newObj = Object.keys(rowColObjects)
  .reduce((acc, row) => {
    acc[row] = {
      id: rowColObjects[row].id,
      name: rowColObjects[row].name,
      ...Object.keys(rowColObjects[row])
        .slice(2)
        .reduce((acc2, col, i) => {
          if (i % 2 !== 0) acc2[col] = rowColObjects[row][col];

          return acc2;
        }, {})
    };

    return acc;
  }
  , {});

另一种方法是将保留 id存储在另一个变量中。

const newObj = Object.keys(rowColObjects)
  .reduce((acc, row) => {
    acc[rowColObjects[row].id] = Object.keys(rowColObjects[row])
      .slice(2)
      .filter((_, i) => i % 2 !== 0);

    return acc;
  }, {});

超级快。仅花了大约2秒钟。然后,您可以创建一种机制来将剩余项目存储回对象。

答案 3 :(得分:0)

Object.keys(rowColObjects).forEach(key => {
    const rowObject = rowColObjects[key]
    Object.keys(rowObject).forEach(colKey => {
        if(!['id', 'name'].includes(colKey)) {
            delete rowObject[colKey]
        }
    })
})