繁体   English   中英

识别数组中具有与另一个对象数组中的属性唯一的属性的对象的最快方法

[英]quickest way to identify objects in array which have properties that are unique from properties in another object array

我有两个数据数组:

markerArray = [{
  properties: {id: 1}
},
{
  properties: {id: 2}
}];

data = [
 { id: 1},
 { id: 2},
 { id: 3}
]

我想尽快从data中创建一个新的对象数组,这些data的id在markerArray的properties.id中不存在。

Lodash /下划线是一个选项。

不知道最快,但最简单的肯定是lodash:

_.difference(_.pluck(data, "id"),
    _.pluck(_.pluck(markerArray, "properties"),"id"));

您可以使用map映射ID,然后使用filter查看data数组:

var ids = markerArray.map(function(item) {
  return item.properties.id;
});

var result = data.filter(function(item) {
  return ids.indexOf(item.id) < 0;
});

建议您映射一个仅包含ID的第一个数组:

var idArray= markerArray.map(function(item){
  return item.properties.id
});
//[1,2]

然后查找id数组中存在的匹配项:

var result = data.filter(function(item){ 
      return idArray.indexOf(item.id) === -1;
});

这是一个lodash解决方案:

_.reject(data, _.flow(
    _.identity,
    _.property('id'),
    _.partial(_.includes, _.map(markerArray, 'properties.id'))
));

基本上,您想使用reject()从数据中删除不需要的项(通过创建副本,而不是通过修改原始项)。 我们使用flow()构建回调函数,以确定哪些项目被拒绝。 细目如下:

  • 传递给reject()回调函数具有几个参数-我们只关心第一个参数。 这就是identity()所做的,它将第一个参数传递给flow()的下一个函数。
  • property()函数返回一个新函数。 这个新函数将返回给定项目的id属性。 同样,此id是下一个flow()函数的输入。
  • 然后,我们使用partial()进行实际过滤。 部分应用的参数是markerArray的ID数组。 我们从中创建部分函数的函数包括include() 如果来自data的ID位于此数组中,我们可以将其从结果中删除。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM