@dmitry2000

Как уникализировать массив объектов?

Массив из строчек по типу let arr = ['Один', 'Два', 'Два', 'Три']
можно уникализоровать с помощью arr = Array.from(new Set(arr));
А если, к примеру, массив объектов
let arr = [
                { label: 'Критичная', value: 'critical' },
                { label: 'Средняя', value: 'medium' },
                { label: 'Не критичная', value: 'low' },
                { label: 'Не критичная', value: 'low' },
                { label: 'Не критичная', value: 'low' }
            ];

Можно ли с ним проделать то же самое, убрать лишние объекты по значению или ключу?
  • Вопрос задан
  • 739 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Собираем ключ-значение, выдёргиваем значения:

[...new Map(arr.map(n => [ n.value, n ])).values()]

// или

Object.values(arr.reduce((acc, n) => (acc[n.value] ??= n, acc), {}))

Фильтрация, запоминаем кого встретили, первый раз пропускаем, остальные нет:

arr.filter(function(n) {
  return !(this[n.value] = this.hasOwnProperty(n.value));
}.bind({}))

// или

arr.filter(function({ value }) {
  return !this.set(value, this.has(value)).get(value);
}, new Map)

// или

arr.filter(((picked, { value: n }) => !picked.has(n) && picked.add(n)).bind(null, new Set))

Фильтрация, ищем элемент похожий на текущий, его же и нашли - окей:

arr.filter((n, i, a) => n === a.find(m => m.value === n.value))

// или

arr.filter((n, i, a) => i === a.findIndex(m => m.value === n.value))

Ну и чего-нибудь странного ещё добавим:

Array.from(
  new Set(arr.map(n => n.value)),
  n => arr.find(m => m.value === n)
)

// или

arr
  .slice()
  .sort((a, b) => a.value.localeCompare(b.value))
  .filter((n, i, a) => n.value !== a[i - 1]?.value)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы