我有两个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);

10-06 12:00