Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用集合作为谓词来筛选数组_Javascript_Arrays_Lodash - Fatal编程技术网

Javascript 如何使用集合作为谓词来筛选数组

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 },

假设我有一个巨大的数组集合(100K条记录),比方说(
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