gpt4 book ai didi

Javascript 从数组中删除对象的最快方法

转载 作者:搜寻专家 更新时间:2023-11-01 04:44:20 25 4
gpt4 key购买 nike

在速度至关重要的应用程序上工作,数组非常庞大 并且数组中包含的对象。

我用 grep 做了实验和 filter并且看不到显着的速度差异,变化 +- 5ms ,还尝试遍历数组并使用 .splice(i,1);/strong>(相同的结果)。

我有一台速度很快的机器,如果它总是在速度快的机器上花费或多或少相同的时间,是否意味着在旧机器上它会花费更多或更少的相同时间?

有没有更快的方法从数组中删除对象?

想做这样的事情:

var filterTime = performance.now();
doStuff1();
var filterTimeEnd = performance.now();

var grepTime = performance.now();
doStuff2();
var grepTimeEnd = performance.now();

然后将差异存储在 cookie 中,以便下次加载或刷新页面时,执行最有效的方法:从数组中删除对象。

更新

过滤器实验片段

      companyMasters = companyMasters.filter(function (obj) {
return obj.masterId != CompanyObj.masterId;
});

最佳答案

现有的答案已经提供了很好的解决方案来降低底层问题的运行时复杂性。

不过,我也想简要回答最初的问题,因为这是谷歌搜索如何以最高效的方式从数组中删除的第一页。

不维护顺序按索引删除的最快方法是通过将最后一个元素分配给要删除的索引并从数组中弹出来删除,因为它有 O (1) 运行时复杂度。

Array.prototype.mySwapDelete = function arrayMySwapDelete (index) {
this[index] = this[this.length - 1];
this.pop();
}

在保持秩序的情况下,按索引移除的最快方法是原地移动:

Array.prototype.myShiftDelete = function arrayMyShiftDelete (index) {
var stop = this.length - 1;
while (index < stop) {
this[index] = this[++index];
}

this.pop();
}

我创建了一个 JS perf 片段来对不同的函数进行基准测试:https://jsperf.com/array-remove-by-index

当想要过滤时,就地过滤和移位也比调用本地.filter() 函数快得多,后者分配一个新数组。这个就地过滤器也维持秩序:

Array.prototype.myShiftFilter = function arrayMyShiftFilter (predicate) {
let i, j;

for (i = 0, j = 0; i < this.length; ++i) {
if (predicate(this[i])) {
this[j] = this[i];
++j;
}
}

while (j < this.length) {
this.pop();
}
}

另请参阅基准测试的 JS Perf 片段:https://jsperf.com/array-filter-in-place

关于Javascript 从数组中删除对象的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30304719/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com