javascript - 将两个对象数组与 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 分钟 - 更好)
也许我应该以某种方式完全重塑我的逻辑?使用一些算法(想知道 - 哪一个)
解决方案
当我有大量数据时,它非常慢 - 通常每个数组项大约有 80k-100k
为此任务使用数据库。一个好的 DBMS 应该能够使用散列连接或类似技术在不到一秒的时间内完成此比较。当然,如果你坚持的话,你可以在 node.js 中重新实现它——使用文章标识符作为Map
.
推荐阅读
- python - 带有 MultiIndex 的 Pandas 数据框
- javascript - 使用 JavaScript 读取和写入同一域中的文件
- javascript - Vue级联自动完成对象键
- ios - SwiftUI:列表错误无法调用非函数类型'绑定的值
' - java - 如何在 from 路由中使用方法变量
- python-3.x - 如何从 python3 中的 .txt 文件中获取未编码的字符?
- java - 我的二维数组程序的打印输出出现问题
- c++ - Makefile 找不到共享库
- spring - Spring Data JPA - 具有规范和可分页的基于类的投影
- swift - 如何在 Xcode 中查看 *public only* Swift 文件的界面?