Решение:
Вы можете использовать filter
с локальным Set
объектом.Сравнивая строковые объекты и свойство size
до и после попытки добавления к Set
, вы можете вернуть уникальный массив, спросив, не совпадают ли два числа.
Код:
place_array.filter(v => b.size != b.add(JSON.stringify(v)).size, b = new Set());
Зачем использовать этот код?
В отличие от многих других ответов, он опирается на единственный проход через массив с помощьюитератор фильтра.Это означает, что он более производительный, чем несколько циклов в массиве.Он также использует только локализованные переменные, что означает, что они не являются глобальным беспорядком и, поскольку метод filter
является функциональным, абсолютно никаких побочных эффектов.
Примечание: Всегда естьснижение производительности при использовании объекта Set
в любой ситуации. Это сводится к внутренним элементам браузера, однако при нахождении уникальных объектов / массивов stringify
в методе Set
, вероятно, лучшее решение.Хотя с невероятно маленькими наборами данных вы можете найти практичным использование массива или создание собственного объекта для конкретной задачи.
Рабочий пример:
let place_array = [{
"places": "NEW YORK",
"locations": "USA"
},
{
"places": "MONTREAL",
"locations": "QUEBEC",
"country": "Canada"
},
{
"places": "MONTREAL",
"locations": "QUEBEC",
"country": "Canada"
},
];
let result = place_array.filter(v => b.size != b.add(JSON.stringify(v)).size, b = new Set());
console.log(result);
Альтернативное решение:
Вы можете использовать filter
с локальным Array
объектом.Определив, присутствуют ли уже строковые объекты в массиве, и нажав, если их нет, вы можете вернуть уникальный массив, спросив, не включен ли в массив строковый объект.
Код:
place_array.filter(v => !b.includes(s(v)) && !!b.push(s(v)), s = JSON.stringify, b = []);
Зачем использовать этот код?
Эффективный, хотя объект Set
может быть, он в конечном итоге медленнее из-за внутренних процессов, чем использование объекта Array
.Вы можете легко доказать это, запустив тест, такой как jsperf: https://jsperf.com/set-vs-ray-includes-battle/1
Результаты теста:
Рабочий пример:
let place_array = [{
"places": "NEW YORK",
"locations": "USA"
},
{
"places": "MONTREAL",
"locations": "QUEBEC",
"country": "Canada"
},
{
"places": "MONTREAL",
"locations": "QUEBEC",
"country": "Canada"
},
];
let result = place_array.filter(v => !b.includes(s(v)) && !!b.push(s(v)), s = JSON.stringify, b = []);
console.log(result);