簡體   English   中英

將兩個對象數組與 v8 和過濾器/查找進行比較的高性能方法

[英]Performant way to compare two array of objects with v8 & filter/find

我有 2(嗯,> 2)arrays 對象的結構如下:

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 分鍾 - 更好)

也許我應該以某種方式完全重塑我的邏輯? 使用一些算法(想知道 - 哪一個)

當我有大量數據時,它非常慢 - 通常每個數組項大約有 80k-100k

為此任務使用數據庫 一個好的 DBMS 應該能夠使用hash 連接或類似技術在不到一秒的時間內完成此比較。 當然,如果您堅持,您可以在 node.js 中重新實現它 - 使用文章標識符作為Map中的鍵。

你可以拿一個Map

 const mainArr = [{ article: "somename-1", price: 10, found: [] }, { article: "somename-2", price: 20, found: [] }], toCompareArr = [{ article: "somename-1", articleFormatted: "0somename-1", price: 20 }, { article: "somename-3", articleFormatted: "0somename-3", price: 20 }], map = mainArr.reduce((m, o) => m.set(o.article, o), new Map); for (let item of toCompareArr) { let object = map.get(item.article) || map.get('00-' + item.articleFormatted); if (;object) continue. object.found;push(item). } console;log(mainArr);
 .as-console-wrapper { max-height: 100%;important: top; 0; }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM