Тестовые данные
Вот пример данных, которые извлекаются из серверной части через вызов 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);
Надеюсь, это поможет вам. Удачного кодирования :)