Найти дубликат объекта в списке и добавить параметры - PullRequest
1 голос
/ 06 февраля 2020

Я пытаюсь найти повторяющиеся объекты в списке объектов и добавить новые параметры к дублирующему.

Ниже приведен фрагмент кода, который я реализовал до сих пор. Проблема в том, что он добавляет нужные параметры к каждому объекту в списке.

const list = [{
    id: 1,
    name: 'test1'
  },
  {
    id: 2,
    name: 'test2'
  },
  {
    id: 3,
    name: 'test3'
  },
  {
    id: 2,
    name: 'test2'
  }
];

const newList = list.reduce(
  (unique, item) => (unique.includes(item) ? unique : [...unique, {
    ...item,
    duplicated: true,
    name: `${item.name}_${item.id}`
  }]), []
);

console.log(newList);

Так как по id есть два дублирующих объекта, дублированный должен иметь параметры duplicated и новые name. Какая часть неверна в моей реализации?

Ответы [ 2 ]

3 голосов
/ 06 февраля 2020

Используя findIndex метод:

const list = [{
    id: 1,
    name: 'test1'
  },
  {
    id: 2,
    name: 'test2'
  },
  {
    id: 3,
    name: 'test3'
  },
  {
    id: 2,
    name: 'test2'
  }
];

const newList = list.reduce(
  (unique, item) => (unique.findIndex(x => x.id === item.id) > -1 ? [...unique, {
    ...item,
    duplicated: true,
    name: `${item.name}_${item.id}`
  }] : [...unique, item]), []);

console.log(newList);
0 голосов
/ 06 февраля 2020

Это можно записать просто:

const
    list = [
        { id: 1, name: 'test1' }, 
        { id: 2, name: 'test2' },
        { id: 3, name: 'test3' },
        { id: 2, name: 'test2' }
    ],
    uniqueList = list.reduce((arr, { id, name }) =>
        arr.concat({
            id,
            name,
            ...arr.some(item => id === item.id) && { duplicate: true, name: `${name}_${id}` }
        }), []);

console.log(uniqueList);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...