【问题标题】:How can I subtract one array from another? [duplicate]如何从另一个数组中减去一个数组? [复制]
【发布时间】:2014-10-20 17:02:56
【问题描述】:

我有两个数组:

var collectionA = [
    {'name': 'Brandon', 'age': '41'}
];
var collectionB = [
    {'name': 'Brandon', 'age': '41'},
    {'name': 'Tom', 'age': '25'},
    {'name': 'Jimmy', 'age': '36'},
    {'name': 'Brian', 'age': '36'}
];

我怎样才能创建第三个数组,它基本上是从collectionB 中减去collectionA 的结果?仅供参考:我在这个项目中使用了 Underscore 和 Backbone,并且很乐意使用其中之一。

第三个数组如下所示:

var collectionC = [
    {'name': 'Tom', 'age': '25'},
    {'name': 'Jimmy', 'age': '36'},
    {'name': 'Brian', 'age': '36'}
];

【问题讨论】:

  • 注意:这里根本没有 JSON,你拥有的是带有 Javascript 对象的 Javascript 数组。 JSON 是一种用于表示对象的文本格式。
  • 没有“json 数组”这样的东西。有可以将数组编码到其中的json字符串。但是您不会以您想要的方式使用 json 字符串。您将它们解码为原生结构,例如一个 javascript 数组,然后对这些原生结构做任何你想做的事情。
  • 第一步是编写一个函数(或在您的框架中找到一个)来进行某种基于属性的对象比较。具有匹配属性的两个对象仍然是两个对象,因此必须有一个比较器。一旦你得到了它,那么它基本上与简单字符串或数字列表而不是对象的类似问题相同。

标签: javascript underscore.js


【解决方案1】:

您可以在第二个集合中使用 _.filter_.some

_.filter(collectionB, function(x) { 
    return !_.some(collectionA, function(y) { 
        return y.name == x.name 
    }) 
});

或者等效地使用_.reject:

_.reject(collectionB, function(x) { 
    return _.some(collectionA, function(y) { 
        return y.name == x.name 
    }) 
});

这可能不是最有效的——如果您有大型集合,您可能需要更优化的东西(即,首先制作哈希映射以加快内部查找)。

【讨论】:

    【解决方案2】:

    SOLUTION

    var collectionA = [
        {'name': 'Brandon', 'age': '41'},
        {'name': 'Tom', 'age': '25'},
        {'name': 'Jimmy', 'age': '36'},
        {'name': 'Brian', 'age': '36'}
    ];
    var collectionB = [
        {'name': 'Brandon', 'age': '41'}
    ];
    var subtract = function(a, b){
      var r = {};
      for(var i in a){
        var ai = a[i];
        for(var j in b){
          var bj = b[j];
          if(ai.name != bj.name || ai.age != bj.age){
           r[i] = ai;
          }
        }
      }
      return r;
    };
    
    var c = subtract(collectionA,collectionB);
    

    【讨论】:

      猜你喜欢
      • 2013-02-21
      • 1970-01-01
      • 1970-01-01
      • 2017-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多