我以数组为例: -
示例
var a =[{name :"Adi", age:23},{name:"aman" ,age : 23},{name : rob,age:52}];
我应该删除键名还是应该将其指定为undefined,哪种方法好? 我的意思是删除操作符需要花费很多时间,或者设置undefined应该适用于这么多迭代?
答案 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
})
由于承诺有一些开销,因此切换到原始for
和setTimeout
以获取较小的块是有意义的。
计算密集型任务应该在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);
说明:
(p)
的每个属性{o}
。没有办法避免O(o * p)
时间复杂性。