[英]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 分鍾 - 更好)
也許我應該以某種方式完全重塑我的邏輯? 使用一些算法(想知道 - 哪一個)
你可以拿一個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.