Как получить уникальные значения из массива объектов в JavaScript?
У меня есть следующий массив:
var array =
[
{"name":"Joe", "age":17},
{"name":"Bob", "age":17},
{"name":"Carl", "age": 35}
]
Каков наилучший способ получить массив всех уникальных возрастов, чтобы результатом был массив вида:
[17, 35]
Существует ли способ, позволяющий по-другому структурировать данные или использовать лучший метод, чтобы мне не пришлось итерировать по каждому элементу массива, проверяя значение "age" и сравнивая с другим массивом на наличие этого значения, добавляя его при отсутствии?
Если бы существовал способ просто извлечь уникальные возраста без итерирования...
Текущий неэффективный способ, который я хотел бы улучшить... Если это означает, что вместо того, чтобы "array" был массивом объектов, он мог бы быть "картой" объектов с каким-то уникальным ключом (например, "1,2,3"), это тоже подошло бы. Я просто ищу наиболее производительно эффективный способ.
Вот как я сейчас это делаю, но, по-моему, итерация выглядит неэффективно, хотя и работает:
var distinct = []
for (var i = 0; i < array.length; i++)
if (array[i].age not in distinct)
distinct.push(array[i].age)
5 ответ(ов)
Для тех, кто хочет вернуть массив объектов с уникальными свойствами по ключу, вот пример кода на JavaScript:
const array = [
{ "name": "Joe", "age": 17 },
{ "name": "Bob", "age": 17 },
{ "name": "Carl", "age": 35 }
];
const key = 'age';
const arrayUniqueByKey = [...new Map(array.map(item => [item[key], item])).values()];
console.log(arrayUniqueByKey);
/*OUTPUT
[
{ "name": "Bob", "age": 17 },
{ "name": "Carl", "age": 35 }
]
*/
// Примечание: данный подход выберет последний дублирующийся элемент в списке.
В этом примере мы используем объект Map, который позволяет хранить пары ключ-значение. Мы создаем Map, перебирая массив и маппируя значения с ключом, который мы указали (в данном случае 'age'). Так как Map не допускает дубликатов ключей, только последний элемент с уникальным ключом останется в результате. После этого мы используем оператор расширения ... для конвертации Map обратно в массив.
Для того чтобы получить уникальные значения возраста из вашего массива объектов с использованием ES6, можно использовать метод map для извлечения значений возраста, а затем метод filter для удаления дубликатов. Вот ваш код:
let array = [
{ "name": "Joe", "age": 17 },
{ "name": "Bob", "age": 17 },
{ "name": "Carl", "age": 35 }
];
let uniqueAges = array.map(item => item.age) // Извлекаем возраста
.filter((value, index, self) => self.indexOf(value) === index); // Убираем дубликаты
console.log(uniqueAges); // [17, 35]
В данном случае map создает новый массив, содержащий только значения возраста, а filter проверяет, является ли текущий элемент первым в своем массиве (это выражение self.indexOf(value) === index обеспечивает уникальность). В результате мы получаем массив уникальных возрастов, [17, 35].
Используя возможности ES6, вы можете сделать что-то подобное:
const uniqueAges = [...new Set(array.map(obj => obj.age))];
Этот код сначала извлекает возраст из объектов в массиве с помощью метода map, а затем создает новый набор (Set), который автоматически удаляет дубликаты. В конце мы используем оператор расширения (...), чтобы преобразовать набор обратно в массив, содержащий только уникальные значения возраста.
Вот как вы можете решить эту задачу, используя Set в ES6 на момент 25 августа 2017 года.
TypeScript:
Array.from(new Set(yourArray.map((item: any) => item.id)))
JavaScript:
Array.from(new Set(yourArray.map((item) => item.id)))
В этом коде мы сначала используем метод map, чтобы извлечь идентификаторы из массива объектов, а затем создаем новый Set, который автоматически удаляет дубликаты. Наконец, Array.from преобразует этот Set обратно в массив. Это эффективно для получения уникальных значений из массива.
Если бы это было на PHP, я бы создал массив с ключами и использовал array_keys в конце. Однако в JavaScript такой возможности нет. Вместо этого попробуйте использовать следующий код:
var flags = [], output = [], l = array.length, i;
for (i = 0; i < l; i++) {
if (flags[array[i].age]) continue;
flags[array[i].age] = true;
output.push(array[i].age);
}
Этот код позволяет вам сортировать уникальные значения по полю age в массиве объектов. Мы используем массив flags для отслеживания уже встреченных значений age. Если значение уже было обработано, мы просто пропускаем его.
Сортировка массива объектов по значению строкового свойства
Получить объект JavaScript из массива объектов по значению свойства
Найти значение в массиве объектов на JavaScript
Как удалить все дубликаты из массива объектов?
Как проверить, содержит ли массив строку в TypeScript?