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

时间:2015-09-29 17:42:35

标签: javascript arrays filter underscore.js lodash

我有两个数据数组:

public

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

我希望尽快从data = [ { id: 1}, { id: 2}, { id: 3} ] 创建一个新的对象数组,这些对象的id在markerArray中不存在data

Lodash /下划线是一种选择。

4 个答案:

答案 0 :(得分:1)

不确定最快,但最简单的是使用lodash:

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

答案 1 :(得分:0)

您可以使用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;
});

答案 2 :(得分: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;
});

答案 3 :(得分:0)

这是一个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数组。我们创建部分的函数是includes()。如果来自data的ID在此数组中,我们可以将其从结果中删除。