Тестовые данные

Вот пример данных, которые извлекаются из серверной части через вызов API. Мы хотели бы удалить повторяющихся авторов на основе их имени.

const data = [
  { post: { id: "1001", author: { id: "1", name: "Rocky" } } },
  { post: { id: "1002", author: { id: "2", name: "David" } } },
  { post: { id: "1003", author: { id: "1", name: "Rocky" } } },
  { post: { id: "1004", author: { id: "3", name: "Bob" } } },
  { post: { id: "1005", author: { id: "2", name: "David" } } },
];

Цель

Чтобы удалить повторяющихся авторов из массива. И это должно выглядеть примерно так.

const data = [
  { post: { id: "1001", author: { id: "1", name: "Rocky" } } },
  { post: { id: "1002", author: { id: "2", name: "David" } } },
  { post: { id: "1004", author: { id: "3", name: "Bob" } } },
];

1. Использовать метод уменьшения()

Мы можем использовать метод reduce() для перебора объектов и посмотреть, есть ли у нас уже добавленный в аккумулятор объект с тем же именем автора, что и у текущего объекта.

const result = data.reduce((acc, curr) => {
  if (!acc.find((item) => item.post.author.name === curr.post.author.name))
    acc.push(curr);
  return acc;
}, []);
console.log(result);

2. Использовать объект карты

Использование Карты — более производительный прием, но он не смог сохранить порядок исходного массива.

Здесь мы храним пары [ключ, значение] на карте, где ключ — это имя автора, а значение — весь объект, поэтому на карте хранятся только уникальные авторы. Затем мы распространяем map.values() в массиве результатов.

const result = [
  ...new Map(data.map((obj) => [obj.post.author.name, obj])).values(),
];
console.log(result);

3. Использовать метод фильтра + набор

Используем Set и его методы add и has.

Здесь мы проверяем, присутствует ли имя автора в наборе внутри метода фильтрации, и возвращаем логическое значение на основе условия.

const set = new Set();
const result = data.filter((obj) => {
  const duplicate = set.has(obj.post.author.name);
  set.add(obj.post.author.name);
  return !duplicate;
});
console.log(result);

4. Использовать метод filter + метод findIndex

мы используем метод findIndex. Это, вероятно, наименее производительный метод из всех, так как мы зацикливаемся дважды. что равно O(n²)T.

Здесь метод findIndex возвращает конкретный индекс, если условие выполнено, и -1, если нет.

const result = data.filter(
  (value, index, self) =>
    index ===
    self.findIndex((item) => value.post.author.name === item.post.author.name)
);
console.log(result);

5. Используйте loadsh.uniqueWith()

Если вы использовали популярную библиотеку под названием Lodash, то функция uniqueWith() может оказаться для вас подходящим и быстрым решением.

const _ = require("lodash");
const result = _.uniqWith(
  data,
  (arrVal, othVal) => arrVal.post.author.name === othVal.post.author.name
);
console.log(result);

Надеюсь, это поможет вам. Удачного кодирования :)