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
你是想删除object
b
,还是想删除
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]));
});