节点在数组中查找的快速方法

时间:2019-03-01 09:08:59

标签: arrays node.js

我有问题。

当我的数组中最多只有5000个对象时,我的脚本运行良好且速度很快。

现在有超过20.000个对象,并且运行速度越来越慢...

这就是我的称呼

    for(var h in ItemsCases) {
        if(itmID == ItemsCases[h].sku) {

对于每个对象都带有“ for”,并检查sku在哪里是我的itmID,因为我不需要每个ItemsCases。每次只有几个。

但是,从中取出需要的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) {

骨架也是一个数组

1 个答案:

答案 0 :(得分:2)

ItemsCases.find(item => item.sku === itmID)(或像您这样的for循环,具体取决于实现)是处理数组最快的方法(如果可以返回多个项目,请改用filter find)。

如果需要更快的速度,请使用Map或对象查找。它确实需要准备和记忆,但是如果您进行了大量搜索,那可能是值得的。例如,使用Map

// 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);

可以通过对数组进行预排序,然后在其上使用二进制搜索来实现折衷(不占用更多内存,但可以提高速度),这比在未准备好的数组上进行线性搜索要快得多。