【问题标题】:quickest way to identify objects in array which have properties that are unique from properties in another object array识别数组中具有与另一个对象数组中的属性不同的属性的对象的最快方法
【发布时间】:2015-09-29 17:42:34
【问题描述】:

我有两个数据数组:

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

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

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

Lodash / 下划线是一个选项。

【问题讨论】:

  • 您的问题充满了相互矛盾的陈述。请扩展样本并显示所需的结果。
  • 对不起,你必须告诉我你发现什么冲突。
  • 您的 markerArray 数组在语法上不正确,它缺少一个结束 } 括号。
  • 简化问题和修复代码错误

标签: javascript arrays filter underscore.js lodash


【解决方案1】:

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

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

【讨论】:

  • 仅供参考:这比使用本机数组映射或过滤器快得多,如this Fiddle jsfiddle.net/ypyv782f
  • 我的控制台在这里显示 ative 版本的速度要快得多。
  • 看起来非常依赖浏览器(就像大多数基准测试一样)。根据我的基本测试,在 Chrome 中,Lo-dash 版本似乎快了一个数量级,而在 Firefox 中稍微慢一些,在 Safari 中快两倍。不下结论,只是分享我的观察。
【解决方案2】:

建议你映射一个只包含第一个 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】:

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

    【讨论】:

      【解决方案4】:

      这是一个 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 在此数组中,我们可以将其从结果中删除。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-09-23
        • 2018-10-09
        • 2022-11-21
        • 1970-01-01
        • 1970-01-01
        • 2013-10-14
        相关资源
        最近更新 更多