javascript - 如何高性能地从两个数组中提取子数组?

标签 javascript arrays json performance

我有两个 JSON 对象数组:

  • 一个包含大约 60,000 个元素,代表我的引用数据集。里面的每个 JSON 都拥有一个键和一些其他属性。请注意,数组中的键可能不是唯一的。
  • 另一个包含不同数量的元素(至少几千个)。内部的每个 JSON 都拥有一个键(也在第一个数组中定义)和一些其他属性。

例如:

let refarray = [{key : 1, attr1 : 'aze', ...}, {key : 1, attr1 : 'zer', ...},{key : 2, attr1 : 'ert'},...]
let otherarray = [{key : 1, attr2 : 'wxc', ...}, {key : 3, attr2 : 'xcv'},...]

我只需要从 refarray 中提取其键存在于 otherarray 中的所有元素。

目前我正在使用 loadash,如下所示:

let newarray = _.filter(refarray , function(d) { return _.findIndex(otherarray , function(s) { return s.key=== d.key;}) >= 0});

但是需要 3 到 15 秒,这太长了。欢迎任何最快的解决方案。谢谢。

最佳答案

您可以尝试缓存otherarray的键,然后过滤refarray。我尝试了一个小样本(尽管我在 node 而不是浏览器上尝试过),并且花费了 100 多毫秒:

let refarray = []
let otherarray = []

for(let i of Array(60 * 1000).keys())
  refarray.push({ key: 1 + (i % 1200) })

for(let i of Array(1000).keys())
  otherarray.push({ key: i + 1 })

console.time('cache')
let cache = _.uniq(_.map(otherarray, n => n.key))
const inCache = n => cache.indexOf(n.key) !== -1

let newArray = _.filter(refarray, inCache)

console.timeEnd('cache')
console.log(refarray.length, otherarray.length, newArray.length);

关于javascript - 如何高性能地从两个数组中提取子数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41828689/

相关文章:

python - 如何在 Python 中对列表运行算法并将结果存储在列表中?

php - 在输入 mysql 之前删除 Word 格式,以获得 JSON 输出

javascript - CSS Textsize 基于容器宽度?

Ruby,如何将一个数组改组为另一个数组

c - 修改字符指针字符串数组(char * string[])

python - 如何将 CSV 转换为 JSON?

jquery - 我可以看到 JSON 对象,但无法访问值

javascript - 有没有办法在没有 eval() 的情况下操作包含的 JS?

javascript - React.cloneElement 不附加 className

javascript - 如何重定向到Angular2中不同组件的后退按钮单击页面?