Arrays 在数组中查找节点的快速方法
我有个问题 当我的数组中只有5000个对象时,我的脚本运行得又快又好 现在有超过20000个对象,运行速度越来越慢 我就是这么叫它的Arrays 在数组中查找节点的快速方法,arrays,node.js,Arrays,Node.js,我有个问题 当我的数组中只有5000个对象时,我的脚本运行得又快又好 现在有超过20000个对象,运行速度越来越慢 我就是这么叫它的 for(var h in ItemsCases) { if(itmID == ItemsCases[h].sku) { 用“for”表示每个对象,并检查sku在我的itmID中的位置,因为我不希望每个项目都有库存。每次只有很少一部分 但什么是最快和最好的方式,以获得与sku的项目,我需要它 我想我的,不是最快的 我现在得到多个项目与该代码
for(var h in ItemsCases) {
if(itmID == ItemsCases[h].sku) {
用“for”表示每个对象,并检查sku在我的itmID中的位置,因为我不希望每个项目都有库存。每次只有很少一部分
但什么是最快和最好的方式,以获得与sku的项目,我需要它
我想我的,不是最快的
我现在得到多个项目与该代码
var skus = res.response.cases[x].skus;
for(var j in skus) {
var itmID = skus[j];
for(var h in ItemsCases) {
if(itmID == ItemsCases[h].sku) {
sku也是一个数组ItemsCases.find(item=>item.sku==itmID)
(或类似于您的循环的,具体取决于实现)是使用数组所能做的最快的(如果可以返回多个项目,请使用过滤器
,而不是查找
)
如果需要更快,请使用贴图
或对象查找。它确实需要准备和记忆,但如果你搜索了很多,它可能很值得。例如,使用地图
:
// preparation of the lookup
const ItemsCasesLookup = new Map();
ItemsCases.forEach(item => {
const list = ItemsCasesLookup.get(item.sku);
if (list) {
list.push(item)
} else {
ItemsCasesLookup.set(item.sku, [item]);
}
});
然后,您可以获得相同sku的所有项目,如下所示:
ItemsCasesLookup.get(itmID);
通过对数组进行预排序,然后对其使用二进制搜索,可以实现折衷(不是更多内存,而是一些加速),这比对未准备好的数组进行线性搜索要快得多。这取决于您的查询。你是否总是使用itmID
?===
,而不是==
。它比我的查找方式慢。。。你能给我举一个map的例子吗?那么除非你准备好数据,否则你会被困在当前的速度。如果你告诉我你每个sku只有一个项目,或者多个项目可以共享一个sku,我可以。另外,如果数组是固定的,或者您更改了其中的内容。@Rajesh我担心这些测试没有多大意义,因为您正在基准测试中做准备工作,这是没有信息的。如果您担心启动成本,那么启动需要一个单独的基准,搜索本身也需要一个单独的基准。