删除对象键并重新分配不同的键是数千个对象循环迭代的好方法吗?

时间:2018-03-07 18:08:52

标签: javascript typescript

我以数组为例: -

示例

 var a =[{name :"Adi", age:23},{name:"aman" ,age : 23},{name : rob,age:52}];

我应该删除键名还是应该将其指定为undefined,哪种方法好? 我的意思是删除操作符需要花费很多时间,或者设置undefined应该适用于这么多迭代?

2 个答案:

答案 0 :(得分:1)

最快的方式是使用原始for循环迭代它们:

for (let i = 0; i < arr.length; i++) {
  const item = arr[i];
  if (item.hasOwnProperty('umra')) {
    item.age = item.umra;
    delete item.umra;
  }
  ...
}

如果要处理的太多,可以在块中处理数组,以零超时分隔。这允许不阻止具有冗长循环的主线程。中间setTimeout或其他异步函数应与Angular中的ngZone.runOutsideAngular一起运行,以不触发更改检测:

const CHUNK_LENGTH = 1000;

ngZone.runOutsideAngular(async () => {
  for (let i = 0; i < arr.length; i++) {
    if (i > 0 && !(i % CHUNK_LENGTH)) {
      // new chunk
      await null;
    }

    const item = arr[i];

    if (item.hasOwnProperty('umra')) {
      item.age = item.umra;
      delete item.umra;
    }
    // ...
  }

  return arr;
})
.then(arr => {
  // .then triggers change detection after runOutsideAngular
})

由于承诺有一些开销,因此切换到原始forsetTimeout以获取较小的块是有意义的。

计算密集型任务应该在Web工作者中执行,但事实并非如此,因为计算量不大,并且在从Web worker接收结果后必须执行相同数量的循环周期。

高效方式是不要让这种情况发生。如果从API请求接收到对象并且需要处理,则可能应该更改API。

答案 1 :(得分:1)

  

使用 Web Workers 阻止用户界面冻结

var worker = run(function() {
  // Better than using if else for each key
  var keyMaps = {
    a: "x",
    b: "y",
    c: "z"
  };

  // Start when objects are available
  onmessage = function(e) {
    objs = e.data;

    // Loop through each object of objects list
    objs = objs.map(function(obj) {
      var o = {};

      // Loop through each key in each object
      for (k in obj) {
        o[keyMaps[k]] = obj[k]
      }

      return o;
    });

    // Let the main program know about the transformation
    postMessage(objs);
    self.close();
  };
});

// Just a wrapper to help create a Web Worker
function run(func) {
  return new Worker(URL.createObjectURL(new Blob([`(${func})()`])));
}

// Response from API
var objs = [{
    a: 1,
    b: 2,
    c: 3
  },
  {
    a: 4,
    b: 5,
    c: 6
  }
];

// Pass in objs received from API
worker.postMessage(objs);

// Do whatever you want with the output
worker.onmessage = event => console.log(event.data);

  

说明:

  1. 对象是否平放或嵌套在一起并不重要。该程序将需要遍历每个对象(p)的每个属性{o}。没有办法避免O(o * p)时间复杂性。
  2. 需要遍历每个对象,并且在每个对象中,需要遍历每个属性。
  3. 防止UI冻结的唯一方法是在Web Worker中编写逻辑。
  4. 使用键映射代替if-else或switch语句,让生活更轻松!