我有一个像这样的对象数组:
var objs = [
{ x : 2,
y : 2,
a : true
},
{ x : 2,
y : 2,
a : false
},
{ x : 2,
y : 3,
a : false
},
{ x : 2,
y : 4,
a : false
},
];
我的目标是只获取值a
设置为false
的对象,所以我这样做了:
var filter = objs.filter(function(obj) { return !obj.a; });
这非常有效,但现在我需要删除具有相同x
和y
其他对象的每个对象,并将a
设置为false
原始数组。因此,在我的示例中,只应移除第二个对象(objs[1]
),因为x
和y
值与objs[0]
相同,但a
}设置为false
。示例的输出将是:
var objs = [
{ x : 2,
y : 2,
a : true
},
{ x : 2,
y : 3,
a : false
},
{ x : 2,
y : 4,
a : false
},
];
图片更清晰:
Obs:仅限Vanilla JS。
答案 0 :(得分:2)
嗯,总是有一种繁琐的方法,即将每个元素与其他元素进行比较。那是O( n 2 )。
for (var i = 0; i < objs.length; i++) {
if (!objs[i].a) continue;
for (var j = objs.length - 1; j >= 0; j--) {
if ( !objs[j].a &&
objs[j].x == objs[i].x &&
objs[j].y == objs[i].y ) {
objs.splice(j, 1);
}
}
}
如果你想要一个O( n )算法,那么你可以使用某种哈希值。
var discard = {};
objs.forEach(function(obj) {
if (obj.a) discard[JSON.stringify([obj.x, obj.y])] = true;
});
objs = objs.filter(function(obj) {
return obj.a || !discard.hasOwnProperty(JSON.stringify([obj.x, obj.y]));
});
答案 1 :(得分:0)
只要您想删除重复x,y
的元素
其中a
设置为false,否则,将它们保留在数组中。
您可以使用filter
以这种方式识别重复项。
var objs = [
{ x : 2,
y : 2,
a : true
},
{ x : 2,
y : 2,
a : false
},
{ x : 2,
y : 3,
a : false
},
{ x : 2,
y : 4,
a : false
},
];
function removeDup(objs){
var uniq = objs.filter(function(n){
var duplicates = objs.filter(function(m){
return n.x==m.x && n.y==m.y
});
// If not duplicated, leave it
// If duplicated and its `a` is false, remove it
return (duplicates.length>1 && n.a) || (duplicates.length==1);
})
return uniq;
}
removeDup(objs); // [{"x":2,"y":2,"a":true},{"x":2,"y":3,"a":false},{"x":2,"y":4,"a":false}]