2016-01-18 2 views
1

У меня есть массив объектов, как это:Удаление объектов с общими переменными в массиве

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. Ouput примера будет таким:

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

Изображение быть более ясным:

Example

OBS .: Vanilla только JS.

+0

Используйте '$ .map()' JQuery метод –

+2

Ответ, кажется, так просто - почти прямой перевод слова, которые вы использовали. Вы пытались решить это самостоятельно и какие у вас были мысли? –

+0

Вы хотите удалить объект 'b' if' b.x === a.x && b.y === a.y' или удалить 'b', если' b.x === b.y'? – TeoMor

ответ

2

Ну, всегда есть утомительный подход, который заключается в сравнении каждого элемента с любым другим элементом. Это O (n).

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 (п) алгоритм, то вы могли бы использовать хэш какой-то.

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])); 
}); 
+0

Спасибо! Я принял ваш ответ, потому что вы представили два способа сделать это. Я буду использовать решение O (n2), его путь быстрее, чем другой: https://jsperf.com/remove-duplicated-variables-in-array –

+0

Для небольшого массива, подобного этому, обязательно. –

0

До тех пор, как вы хотите, чтобы удалить элементы с повторяющимся x,y и из которых a установлено значение ложно, в противном случае оставьте их в массиве. Вы можете просто использовать 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}] 
Смежные вопросы