[英]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为
545
和391
的重复对象对中的任何一个,以将数组缩小为:
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
不检查加深的物体或其他键
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.