使用下划线比较两个对象列表并获取唯一对象

时间:2014-06-04 06:38:15

标签: javascript arrays underscore.js

我们有2个JavaScript对象列表。

var AList = [{id:1,name:"AA"},{id:2,name:"BB"},{id:3,name:"CC"},{id:4,name:"DD"},{id:5,name:"EE"},{id:6,name:"FF"}]

var BList = [{id:1,name:"AA"},{id:2,name:"BB"},{id:3,name:"CC"},{id:4,name:"DD"}]

我们需要消除两个列表中的重复项并返回AList的唯一内容。 (身份证5和6)

我为此使用了通用的JavaScript实现,但我喜欢基于下划线实现更流畅的解决方案。

for(var i=0;i<AList.length;i++){
    for(var j=0;j<fBList.length;j++){
        if(AList[i] && fBList[j] && (AList[i].id == BList[j].id)){
            delete AList[i];
        }
    }
}
var uniqueList= _.uniq(AList);

完成列表删除重复项后,副本中存在空元素,因此我们需要使用_uniq来获取一组唯一值。

_.difference(AList,BList) 

不提供答案。

3 个答案:

答案 0 :(得分:3)

您可以组合两个数组,然后获得唯一的结果。

var uniqueList = _.uniq(AList.concat(BList), function(item) {
  return item.id;
});

或者您可以使用_.property(key)

var uniqueList = _.uniq(AList.concat(BList), _.property('id'));

答案 1 :(得分:2)

不幸的是_.difference确实使用严格相等,并且没有办法通过自定义相等回调来改变它。您仍然需要手动计算它:

AList = _.uniq(AList, _.property('id'));
BList = _.uniq(BList, _.property('id'));

var bIds = _.pluck(BList, "id");
_.filter(AList, function(el) { return !_.contains(bIds, el.id); })

答案 2 :(得分:1)

对于那些像我一样偶然发现的人,lodash现在有一个名为differenceWith的函数,它带有一个比较器。

_.differenceWith(array, [values], [comparator])

https://lodash.com/docs#differenceWith