Задать вопрос

Как вернуть новый массив объектов только с уникальным id вложенного объекта?

https://codesandbox.io/s/relaxed-resonance-3r2cf?f...

Вот из такого массива нужно вернуть новый массив без дублей по user.id

const arr = [
  {
    message: "фыа",
    user: {
      id: 0
    }
  },
  {
    message: "dhfas",
    user: {
      id: 2
    }
  },
  {
    message: "asidfaks",
    user: {
      id: 2
    }
  },
  {
    message: "ouosbop",
    user: {
      id: 3
    }
  },
  {
    message: "nvcbksad",
    user: {
      id: 0
    }
  }
];
  • Вопрос задан
  • 376 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Какие тут есть варианты:

Object.values(Object.fromEntries(arr.map(n => [ n.user.id, n ])))

// или, если в результирующий массив должны попадать те из "одинаковых" элементов,
// что расположены в исходном массиве первыми

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

// или, если также надо сохранять взаимное расположение элементов

arr.filter(function({ user: { id: n } }) {
  return !(this[n] = this.hasOwnProperty(n));
}, {})

Можно решить задачу и в более общем виде - сделаем генератор, выдающий уникальные значения. Принимает в качестве параметров итерируемый объект и признак, по которому осуществляется уникализация (может быть функцией или именем свойства):

function* unique(data, key = n => n) {
  const getKey = key instanceof Function ? key : n => n[key];
  const keys = new Set;

  for (const n of data) {
    const k = getKey(n);
    if (!keys.has(k)) {
      keys.add(k);
      yield n;
    }
  }
}

Теперь можно делать так (ваш случай): const result = [...unique(arr, n => n.user.id)];.

Или так:

Array.from(unique([{id: 1}, {id: 2}, {id: 1}, {id: 1} ], 'id')) // [{id: 1}, {id: 2}]

Или так: ''.concat(...unique('ABBA')) // 'AB'.

Или так:

for (const n of unique(Array(20).keys(), n => Math.sqrt(n) | 0)) {
  console.log(n); // 0 1 4 9 16
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
22 дек. 2024, в 20:40
10000 руб./за проект
22 дек. 2024, в 20:34
3000 руб./за проект
22 дек. 2024, в 20:12
10000 руб./за проект