简体   繁体   English

删除javascript中对象数组的重复对

[英]remove duplicated pairs of object arrays in javascript

Fiddle Example : 小提琴示例

I have an array of objects like this: 我有一个这样的对象数组:

var bigarr = 
[ 
  [ { name: 'ABC',id: 391},{ name: 'XYZ',id: 545}],
  [ { name: 'EFG',id: 390},{ name: 'XYZ',id: 545}],
  [ { name: 'XYZ',id: 545},{ name: 'ABC',id: 391}],
  [ { name: 'ABC',id: 391},{ name: 'XYZ',id: 545}]
];

How can I remove any of the duplicated pair of objects that have id 545 and 391 to reduce the array to this: 如何删除ID为545391的重复对象对中的任何一个,以将数组缩小为:

var newbigarr = 
[ 
  [ { name: 'ABC',id: 391},{ name: 'XYZ',id: 545}],
  [ { name: 'EFG',id: 390},{ name: 'XYZ',id: 545}]
];

I have thought of filtering out the duplicated pairs by making a new list of array: 我曾想过通过制作新的数组列表来过滤出重复的对:

[{391: 391,545: 545},{390: 390,545: 545}]

and then iterating over it and bigarr to build the newbigarr , but my code isn't even able to create that list to begin with. 然后在其上迭代和bigarr打造newbigarr ,但我的代码甚至不能够创建列表开始。

var test_id = [];
for(var i = 0;i < bigarr.length;i++)
{
   var value_obj = {};
   for(var j in bigarr[i])
   {
     var value = bigarr[i][j]["id"];  
     value_obj[value] = value;
   }
   test_id.push(value_obj);
}

console.log(test_id);

I'm using lodash,so any solution involving lodash is welcomed. 我正在使用lodash,因此欢迎任何涉及lodash的解决方案。

If you are using underscore, you could do something like this: 如果使用下划线,则可以执行以下操作:

var bigarr = 
[ 
  [ { name: 'ABC',id: 391},{ name: 'XYZ',id: 545}],
  [ { name: 'EFG',id: 390},{ name: 'XYZ',id: 545}],
  [ { name: 'XYZ',id: 545},{ name: 'ABC',id: 391}],
  [ { name: 'ABC',id: 391},{ name: 'XYZ',id: 545}]
];

console.log(_.uniq(bigarr,function(item){
    return [
        [item[0].id+item[0].name],
        [item[1].id+item[1].name]
    ].sort().toString()
}))

Edit: this only works if you always have one pair of objects with an id and a string name. 编辑:仅当您始终具有一对具有ID和字符串名称的对象时,此方法才有效。 Deepened objects or other keys are not checked 不检查加深的物体或其他键

JSFIDDLE 的jsfiddle

If your using pure js, you can do this something like this just using iteration and a secondary array to keep track of what you've seen: 如果您使用的是纯js,则可以使用迭代和辅助数组来跟踪所看到的内容:

var bigarr = 
[ 
  [ { name: 'ABC',id: 391},{ name: 'XYZ',id: 545}],
  [ { name: 'EFG',id: 390},{ name: 'XYZ',id: 545}],
  [ { name: 'XYZ',id: 545},{ name: 'ABC',id: 391}],
  [ { name: 'ABC',id: 391},{ name: 'XYZ',id: 545}]
];

var seen = [];
var final = [];

for(i = 0; i < bigarr.length; i++){
    var unseen = true;
    for(j = 0;j<seen.length;j++){
        if((seen[j][0] == bigarr[i][0].id && seen[j][1] == bigarr[i][1].id) || (seen[j][0] == bigarr[i][1].id && seen[j][1] == bigarr[i][0].id)
          ){
            unseen = false;
        }
    }
    if(unseen){
        final.push(bigarr[i]);
        seen.push([bigarr[i][0].id, bigarr[i][1].id]);
    }
}

Using Lo-Dash. 使用Lo-Dash。 JSFiddle 的jsfiddle

var bigarr = 
[ 
  [ { name: 'ABC',id: 391},{ name: 'XYZ',id: 545}],
  [ { name: 'EFG',id: 390},{ name: 'XYZ',id: 545}],
  [ { name: 'XYZ',id: 545},{ name: 'ABC',id: 391}],
  [ { name: 'ABC',id: 391},{ name: 'XYZ',id: 545}]
];

var seenIds = {};
var nodup = _.filter(bigarr, function(pair) {
    var ids = [pair[0].id, pair[1].id].sort();
    if(seenIds[ids]) {
        return false;
    } else {
        seenIds[ids] = true;
        return true;
    }
});

One line solution with lo-dash ( jsFiddle ): lo-dash( jsFiddle )一线解决方案:

var bigarr = 
[ 
  [ { name: 'ABC',id: 391},{ name: 'XYZ',id: 545}],
  [ { name: 'EFG',id: 390},{ name: 'XYZ',id: 545}],
  [ { name: 'XYZ',id: 545},{ name: 'ABC',id: 391}],
  [ { name: 'ABC',id: 391},{ name: 'XYZ',id: 545}]
];  

_.uniq(bigarr, function(a) { return _.pluck(a, 'id').sort() + '' });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM