2013-11-11 4 views
1

Попытки получить _.uniq() работает по следующей структуре:Удалить дубликаты из массива объектов - Подчеркните

[ 
    {'x' : 1, 'y': 2}, 
    {'x' : 1, 'y': 2}, 
    {'x' : 2, 'y': 3}, 
    {'x' : 2, 'y': 4}, 
    {'x' : 3, 'y': 4} 
] 

, где должен быть результат:

[ 
    {'x' : 1, 'y': 2}, 
    {'x' : 2, 'y': 3}, 
    {'x' : 2, 'y': 4}, 
    {'x' : 3, 'y': 4} 
] 

т.е. дублировать элементы удалены. Я хотел бы избежать стягивания, потому что мне просто нужно разобрать каждый элемент JSON.

Любая помощь будет оценена по достоинству.

EDIT: tring Решение Мэтта ниже, мне не хватает чего-то, что я думаю - это не работает. Если я вхожу значение для и б, я вижу

_.uniq($scope.validNotes, function (a, b) { 
    console.log(a, b); 
    return a.x === b.x && a.y === b.y; 
}); 


Object {x: 2, y: 3} 0 
Object {x: 1, y: 0} 1 
Object {x: 2, y: 3} 2 
Object {x: 3, y: 2} 3 
Object {x: 4, y: 2} 4 
Object {x: 5, y: 1} 5 

Что, очевидно, означает, что я никогда не найти простофили

+0

возможный дубликат [Javascript - Быстро удалить дубликаты в массив объектов] (http://stackoverflow.com/questions/14650626/javascript-quickly-remove -duplicates-in-object-array) –

+0

Возможный дубликат [Удаление дубликатов объектов с помощью Underscore для Javascript] (http://stackoverflow.com/questions/9923890/removing-duplicate-objects-with-underscore-for-javascript) – Matt

ответ

8

Поскольку два объекта не == или ===, только потому, что они имеют одни и те же ключи, вам нужно будет использовать [iterator] argument of the uniq() function;

_.uniq(myArray, function (item) { 
    return item.x + item.y; 
}); 

Обратите внимание, что вам необходимо вернуть уникальную комбинацию строк; рассмотрите случай { x: 11, y: 1 } и { x: 1, y: 11 }; мой код разрешит как 111, так и обработает их.

Что-то вроде:

_.uniq(myArray, function (item) { 
    return 'x:' + item.x + 'y:' + item.y; 
}); 

... будет более устойчивым, но это зависит от значений данных, конечно.

+0

Перемещено для редактирования по вопросу – Nathan

+0

@Nathan: Eugh, извините ... noobed аргументы итератора. Попробуй? – Matt

+1

удивительный, спасибо. Не знал, как работает итератор, теперь имеет смысл. Работает еще лучше, как только я понял, что мои данные были неверными тоже – Nathan

0

Если у вас есть абстрактная структура данных в вашем JSON, лучше сравнить элементы массива один бит, например строки, используя stringify. Поскольку у вас есть новый объект в каждом элементе массива, каждая буквальная нотация объекта, т. Е. {} создает новый объект на языке javascript, и он не имеет значения, он имеет те же свойства или нет.

Но, если вы stucture как х, у использовать Matt answer

Смежные вопросы