8

Как получить уникальные значения из массива объектов в JavaScript?

14

У меня есть следующий массив:

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 ответ(ов)

6

Для тех, кто хочет вернуть массив объектов с уникальными свойствами по ключу, вот пример кода на 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 обратно в массив.

3

Для того чтобы получить уникальные значения возраста из вашего массива объектов с использованием 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].

1

Используя возможности ES6, вы можете сделать что-то подобное:

const uniqueAges = [...new Set(array.map(obj => obj.age))];

Этот код сначала извлекает возраст из объектов в массиве с помощью метода map, а затем создает новый набор (Set), который автоматически удаляет дубликаты. В конце мы используем оператор расширения (...), чтобы преобразовать набор обратно в массив, содержащий только уникальные значения возраста.

1

Вот как вы можете решить эту задачу, используя 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 обратно в массив. Это эффективно для получения уникальных значений из массива.

1

Если бы это было на 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. Если значение уже было обработано, мы просто пропускаем его.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь