删除数组中具有公共变量的对象

时间:2016-01-18 07:21:33

标签: 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
    },
];

我的目标是只获取值a设置为false的对象,所以我这样做了:

var filter = objs.filter(function(obj) { return !obj.a; });

这非常有效,但现在我需要删除具有相同xy其他对象的每个对象,并将a设置为false原始数组。因此,在我的示例中,只应移除第二个对象(objs[1]),因为xy值与objs[0]相同,但a }设置为false。示例的输出将是:

var objs = [
    {   x : 2,
        y : 2,
        a : true
    },
    {   x : 2,
        y : 3,
        a : false
    },
    {   x : 2,
        y : 4,
        a : false
    },
];

图片更清晰:

Example

Obs:仅限Vanilla JS。

2 个答案:

答案 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}]