【发布时间】:2015-05-28 07:41:09
【问题描述】:
我有几个 JavaScript 数组,每个数组都包含一个指向对象的指针列表。当一个对象满足某个条件时,它的指针必须从其当前包含的数组中移除并放入不同的数组中。
我当前的(天真的)解决方案是 splice 退出现有的数组元素,然后 concatenate 将它们放到他们正在输入的数组中。这是一种缓慢的方法,并且随着时间的推移似乎会导致内存碎片化。
任何人都可以就更好的方法提供建议(一般的或特定于 JS 的)吗?
演示代码:
// Definitions
TestObject = function() {
this.shouldSwitch = function() {
return(Math.random() > 0.9);
}
}
A = [];
B = [];
while(A.length < 500) {
A.push(new TestObject());
}
// Transfer loop
doTransfers = function() {
var A_pending = [];
var B_pending = [];
for(var i = 0; i < A.length; i++) {
if(A[i].shouldSwitch()) {
B_pending.push(A[i]);
A.splice(i,1);
i--;
}
}
for(var i = 0; i < B.length; i++) {
if(B[i].shouldSwitch()) {
A_pending.push(B[i]);
B.splice(i,1);
i--;
}
}
A = A.concat(A_pending);
B = B.concat(B_pending);
}
setInterval(doTransfers,10);
谢谢!
【问题讨论】:
-
是的,你绝对不应该在循环中使用
splice。但是,由于您无论如何都在创建新数组,因此您不能直接将其删除,而是立即推送到新的*_pending。
标签: javascript arrays optimization memory-management data-structures