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