Javascript 删除数组中具有公共变量的对象
我有这样一个对象数组:Javascript 删除数组中具有公共变量的对象,javascript,Javascript,我有这样一个对象数组: 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 }, ]; 我的
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.:仅限香草JS。只要您想删除重复的
x,y
其中a
设置为false,否则,将它们保留在数组中。
您可以简单地使用过滤器以这种方式识别重复项
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}]
好吧,总是有一种枯燥的方法,那就是将每个元素与其他元素进行比较。这就是O(n2)
使用$.map()
jQuery方法答案似乎很简单——几乎是你所用单词的直接翻译。你试过自己解决这个问题吗?你有什么想法吗?如果b.x==a.x&&b.y==a.y
你是想删除objectb
,还是想删除b
如果b.x==b.y
?你是对的@200\u成功,我把这个问题编辑得更清楚了。@TeoMor第一个问题。谢谢!我接受了你的回答,因为你提出了两种方法。我将使用O(n2)溶液,它的速度比其他溶液快:对于这样的小阵列,当然。
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);
}
}
}
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]));
});