【问题标题】:underscore.js filter an array of objects, based on anotherunderscore.js 过滤一个对象数组,基于另一个
【发布时间】:2013-02-12 18:05:14
【问题描述】:

我正在尝试根据另一个对象过滤一组对象。公共属性 ID id。 我不确定 filter + each 是否是最好的方法或 map reduce。无论如何,下面的代码不起作用,因为out 是空列表。

var aaa = [
    {name: "AAA", id: 845},
    {name: "BBB", id: 839},
    {name: "CCC", id: 854}
];
var bbb = [
    {id: 839},
    {id: 854}
];

var out = _.filter(aaa, function(val){
    return _.each(this, function(val2){
        return val['id'] === val2['id']
    });
}, bbb);

【问题讨论】:

    标签: javascript underscore.js


    【解决方案1】:
    bbb = bbb.map(_ => _.id) && aaa.filter(_ => bbb.indexOf( _.id ) > -1)
    

    假设您的用例,您只需要纯 JS 数组函数即可。

    【讨论】:

      【解决方案2】:

      只需创建一个有效 ID 的“集合”并使用该“集合”进行过滤:

      var aaa = [
          {name: "AAA", id: 845},
          {name: "BBB", id: 839},
          {name: "CCC", id: 854}
      ];
      var bbb = [
          {id: 839},
          {id: 854}
      ];
      
      var ids = {};
      _.each(bbb, function (bb) { ids[bb.id] = true; });
      
      var out = _.filter(aaa, function (val) {
          return ids[val.id];
      }, bbb);
      

      填充ids 很快,它在 n * amortized O(1) 中,即 O(n)。过滤也是如此。

      如果您在内循环中使用each(…),您将有 O(n²)。对于更大的数据集,这将变得非常慢。此外,额外的嵌套使代码乍一看更难阅读/理解。

      查看代码在运行中被截断:http://jsfiddle.net/SMtX5/

      【讨论】:

      • 感谢后面的解释和推理。
      【解决方案3】:

      你可以使用_.find来过滤:

      _.filter(aaa, function(a){
          return _.find(bbb, function(b){
              return b.id === a.id;
          });
      });
      

      【讨论】:

        【解决方案4】:

        您可以使用_.some(list, [iterator], [context])

        如果 list 中的任何值通过 iterator 真值测试,则返回 true

        var out = _.filter(aaa, function(val){
            return _.some(this,function(val2){
                return val2['id'] === val['id'];
            });
        }, bbb);
        

        这里是 jsfiddle。 http://jsfiddle.net/h98ej/

        【讨论】:

        • 根据接受的答案,这个例程比接受的要快多少?
        猜你喜欢
        • 2019-10-03
        • 1970-01-01
        • 1970-01-01
        • 2018-04-04
        • 2021-05-31
        • 2021-10-30
        • 2021-05-14
        • 2021-11-21
        • 1970-01-01
        相关资源
        最近更新 更多