Как получить уникальные значения из массива объектов в 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?
Как объединить два массива в JavaScript и удалить дубликаты?
Как удалить все дубликаты из массива объектов?