Javascript 如何使用集合作为谓词来筛选数组
假设我有一个巨大的数组集合(100K条记录),比方说(Javascript 如何使用集合作为谓词来筛选数组,javascript,arrays,lodash,Javascript,Arrays,Lodash,假设我有一个巨大的数组集合(100K条记录),比方说(sourceArray)。我有另一个数组(matchId)的列表,我需要使用它来从此sourceArray中进行筛选。如何使用lodash实现这一点?还是纯JavaScript var sourceArray = [{ "id": 123, }, { "id": 456 }, { "id": 789 }, { "id": 111 }, { "id": 222 },
sourceArray
)。我有另一个数组(matchId
)的列表,我需要使用它来从此sourceArray
中进行筛选。如何使用lodash实现这一点?还是纯JavaScript
var sourceArray = [{
"id": 123,
},
{
"id": 456
},
{
"id": 789
},
{
"id": 111
},
{
"id": 222
},
{
"id": 333
}];
var matchIds = [123, 222];
下面的筛选器仅与单个项目匹配
console.log(
_.filter(sourceArray, function(arr){
return arr.id === 123;
})
);
我实际期望的是arr.id matchId
为什么不简单
var matchingArray = sourceArray.filter( function(item){
return matchIds.indexOf(item.id) != -1
});
这将返回从matchId
匹配的所有项目,为什么不简单地
var matchingArray = sourceArray.filter( function(item){
return matchIds.indexOf(item.id) != -1
});
这将返回从
matchId
匹配的所有项。您的谓词数据结构不是最佳的,并且会通过增加大小对总体性能产生负面影响。最好先将[123222]
转换为哈希或映射。一旦完成,剩下的就是O(n)
var matchIds=[123222],
hash=matchId.reduce((h,id)=>(h[id]=true,h),{})
sourceArray=[{
“id”:123,
},
{
“id”:456
},
{
“id”:789
},
{
“id”:111
},
{
“id”:222
},
{
“id”:333
}];
result=sourceArray.filter(o=>hash[o.id]);
控制台日志(结果)代码>您的谓词数据结构不是最佳的,并且会通过增加大小对总体性能产生负面影响。最好先将[123222]
转换为哈希或映射。一旦完成,剩下的就是O(n)
var matchIds=[123222],
hash=matchId.reduce((h,id)=>(h[id]=true,h),{})
sourceArray=[{
“id”:123,
},
{
“id”:456
},
{
“id”:789
},
{
“id”:111
},
{
“id”:222
},
{
“id”:333
}];
result=sourceArray.filter(o=>hash[o.id]);
控制台日志(结果)代码>匹配ID最多为20个ID。。只有sourceArray是巨大的(有时是100K到150K)@fakirtrappidencode所以。。。这将使您从20多个项目的150K索引中解脱出来,这相当于3M的浪费操作。谢谢。假设如果matchId=[1232229991111],我如何只返回99911111。正如我所见,Iam实际上只对这些不匹配的ID感兴趣,因为我会调用另一个API来返回这些ID的响应..好吧。。。如果希望跟踪不匹配的ID,则可以在哈希表中执行此操作。在筛选器回调函数中,如果执行类似于sourceArray.filter(o=>hash[o]&&(hash[o]=false,true))
的操作,则剩余的具有true的哈希属性将保持不变,这意味着它们在sourceArray
matchId中不存在,最多为20个ID。。只有sourceArray是巨大的(有时是100K到150K)@fakirtrappidencode所以。。。这将使您从20多个项目的150K索引中解脱出来,这相当于3M的浪费操作。谢谢。假设如果matchId=[1232229991111],我如何只返回99911111。正如我所见,Iam实际上只对这些不匹配的ID感兴趣,因为我会调用另一个API来返回这些ID的响应..好吧。。。如果希望跟踪不匹配的ID,则可以在哈希表中执行此操作。在filter回调函数中,如果执行类似于sourceArray.filter(o=>hash[o]&&(hash[o]=false,true))
的操作,则剩余的带true的散列属性将保持不变,这意味着它们不存在于sourceArray