【发布时间】:2019-09-21 15:11:52
【问题描述】:
我有 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 分钟 - 更好)
也许我应该以某种方式彻底改造我的逻辑?使用一些算法(想知道 - 哪一个)
【问题讨论】:
-
请同时添加想要的结果。
-
顺便说一句,
mainArr[i].found从未定义过。 -
"80k-100k 数组项" - 呃,您是在尝试使用 node.js 实现内存数据库吗?
-
基本方法是创建某种 index,以便您可以按名称执行快速查找,而不是对另一个类似大小的数组进行 100,000 次详尽搜索。
-
@Bergi 不,不是真的 :) 数据是从电子表格中解析出来的……这里有什么建议吗?喜欢使用 mongo/sqlite 等?
标签: javascript node.js algorithm v8