首页 > 解决方案 > 将两个对象数组与 v8 和过滤器/查找进行比较的高性能方法

问题描述

我有 2(嗯,> 2)对象数组,其结构如下:

const mainArr = [
  { article: "somename-1", price: 10, found: [] },
  { article: "somename-2", price: 20, found: [] },...
];
const toCompareArr = [
  { article: "somename-1", articleFormatted: "0somename-1", price: 20 },
  { article: "somename-3", articleFormatted: "0somename-3", price: 20 },...
];

对于mainArr ,我尝试在第二个toCompareArr数组中找到所有出现的情况(基本上 - 我需要为不同的供应商创建价格比较器),如下所示:

let i = 0;
let j = 0;
const iMax = mainArr.length;
const jMax = toCompareArr.length;
for (; i < iMax; i++) {
  for (; j < jMax; j++) {
    if (
      mainArr[i].article === toCompareArr[j].article ||
      mainArr[i].article === `00-${toCompareArr[j].articleFormatted}`
    ) {
      mainArr[i].found.push(toCompareArr[j]);
    }
  }

  j = 0;
}

// also tried like this (for + for seems to be more speedy):
/*
let found;
for (; i < iMax; i++) {
  found = toCompareArr.filter(
    item =>
      item.article === mainArr[i].article ||
      item.articleFormatted === mainArr[i].article
  );

  if (found) {
    mainArr[i].found.push(found);
  }
}
*/

结果我想得到

[
  {
    article: "somename-1",
    price: 10,
    found: [
      { article: "somename-1", articleFormatted: "0somename-1", price: 20 }
    ]
  },
  { article: "somename-2", price: 20, found: [] }
];

但是当我有很多数据时它会非常慢(通常每个数组项大约有 80k-100k 数组项)

我卡住了......也许有一种方法可以提高过滤器的性能并在这里找到?我正在使用最新的 Node 和 V8 功能。现在比较需要大约 5 分钟,如果它是 50%(假设是 2 分钟 - 更好)

也许我应该以某种方式完全重塑我的逻辑?使用一些算法(想知道 - 哪一个)

标签: javascriptnode.jsalgorithmv8

解决方案


当我有大量数据时,它非常慢 - 通常每个数组项大约有 80k-100k

为此任务使用数据库。一个好的 DBMS 应该能够使用散列连接或类似技术在不到一秒的时间内完成此比较。当然,如果你坚持的话,你可以在 node.js 中重新实现它——使用文章标识符作为Map.


推荐阅读