Сегодня я наткнулся на это Статья О том, как это говорит о том, как это сложно (вычислительно) удалить дубликаты объектов из массива. Используемый алгоритм является стандартным и еще не очень исполнен в масштабе, поэтому я подумал: «Можем ли мы сделать лучше, можем ли мы придумать быстрее алгоритм».
Перед нашей дальнейшей дискуссией позвольте мне кратко изумнорить оригинальную статью Real. Глядя на образец кода ниже, что вы думаете, что будет выходом последней строки.
let people = [{name: 'vipul', age: 20}, {name: 'vipul', age: 20}]; console.log(people[0] === people[1]);
Ответ – ложь
Поскольку объекты в JavaScript являются ссылочными типами, означающими, что при сравнении двух объектов вместо сравнения ключей там сравниваются ссылки. Поскольку мы создаем новые объекты встроенные, мы получаем новые ссылки каждый раз, и, следовательно, ответ ложь
Отказ
Представляя символы
ES6 Добавлена куча новых функций на языке JavaScript, с которым можно было бы играть несколько новых крутых функций. Один из них Символы , которые действительно круты и могут помочь нам решить проблему лучше.
Наш более быстрый алгоритм
let arr = [ { firstName: "Jon", lastName: "Doe" }, { firstName: "example", lastName: "example" }, { firstName: "Jon", lastName: "Doe" } ]; const removeDuplicates = (arr) => { const symbolValues = []; return arr.filter((item) => { const { firstName, lastName } = item; let keyStr = `${firstName}_${lastName}`; let symbolValue = Symbol.for(keyStr); if (!symbolValues.includes(symbolValue)) { symbolValues.push(symbolValue); return true; } else { return false; } }); };
Объяснение
Алгоритм выхода мы используем два ядра символов
Символ. Для (ключ)
Возвращает одинаковое значение для того же ключа по всей программе.- Символы можно сравнить с другими символами.
Сначала мы повторяем на массиве и создаем эквивалентные значения символов, используя Символ. Для
где ключ представляет собой комбинацию клавиш объекта. Затем мы просто просто фильтруем оригинальный массив на основе условий не нахождения существующего символа с одинаковыми значениями.
Тесты
Я сделал несколько тестов, просто для удовольствия и оказывается, что это решение довольно масштабируется. Вот некоторые результаты
- Для 100 элементов или около того, требуется около 5,5 мс, когда подход, используемый в оригинальной статье, занимает 2,2 м.
- Для 500 элементов или около того, требуется 5,7 мс, тогда как другой алгоритм занимает 11,7 мс.
- Для 1500 элементов или около того, требуется 3,88 мм, тогда как другой алгоритм занимает 32,82 мс.
- Для 8000 элементов или около того, требуется 5,57 мс, тогда как другой алгоритм занимает 60,71 мс.
И после этого я был явно скучно, поэтому, если кто-то найдет это полезно и делает некоторые тестирование на большем и может быть более реальным мировым данным, я хотел бы знать статистику.
Если вы хотите больше поговорить о реализации или что-нибудь еще, вы можете найти меня в Instagram или Twitter, как @vipulbhj
Большое спасибо за чтение, не забудьте поделиться, если вы найдете информацию полезной.
Оригинал: “https://dev.to/vipulbhj/removing-duplicate-objects-from-an-array-4iak”