Найти в Дзене
IT-информатор

Как в JS удалить дублирующиеся объекты в массиве?

Допустим, у нас есть массив объектов, таких как следующие: Первый и последний объекты в массиве идентичны. Так что, если мы хотим удалить такие дубликаты объектов из массива? Удивительно, но это довольно сложная проблема для решения. Чтобы понять почему, давайте посмотрим, как мы можем удалить дубликаты из массива плоских элементов, таких как строки. Удаление дубликатов плоских элементов из массива Допустим, у нас есть следующий массив: Если бы мы хотели удалить любые дубликаты из этого массива, мы могли бы использовать метод filter() вместе с методом indexOf(), чтобы проверить, является ли какой-либо элемент дубликатом. Поскольку strings.indexOf(item) всегда будет возвращать индекс первого элемента, мы можем сказать, является ли текущий элемент в цикле фильтра дубликатом. Если это так, мы не возвращаем его в новый массив, созданный методом filter() Объекты не работают одинаково Причина, по которой этот же метод не работает с объектами, заключается в том, что любые два объекта с одина
Оглавление

Допустим, у нас есть массив объектов, таких как следующие:

Первый и последний объекты в массиве идентичны. Так что, если мы хотим удалить такие дубликаты объектов из массива? Удивительно, но это довольно сложная проблема для решения. Чтобы понять почему, давайте посмотрим, как мы можем удалить дубликаты из массива плоских элементов, таких как строки.

Удаление дубликатов плоских элементов из массива

Допустим, у нас есть следующий массив:

-2

Если бы мы хотели удалить любые дубликаты из этого массива, мы могли бы использовать метод filter() вместе с методом indexOf(), чтобы проверить, является ли какой-либо элемент дубликатом.

-3

Поскольку strings.indexOf(item) всегда будет возвращать индекс первого элемента, мы можем сказать, является ли текущий элемент в цикле фильтра дубликатом. Если это так, мы не возвращаем его в новый массив, созданный методом filter()

Объекты не работают одинаково

Причина, по которой этот же метод не работает с объектами, заключается в том, что любые два объекта с одинаковыми свойствами и значениями на самом деле не считаются идентичными.

-4

Это потому, что объекты сравниваются на основе ссылки, а не структуры. Тот факт, что два объекта имеют одинаковые свойства и значения, не учитывается при сравнении этих двух объектов. Следовательно, indexOf(object) в массиве объектов всегда будет возвращать индекс точного переданного объекта, даже если существует другой объект с точно такими же свойствами и значениями.

Мое решение

Учитывая эту информацию, единственный способ проверить, имеют ли два объекта одинаковые свойства и значения, состоит в том, чтобы фактически проверить свойства и значения каждого объекта. Решение, которое я придумал, заключалось в выполнении этой ручной проверки, но с некоторыми усовершенствованиями для повышения производительности и уменьшения ненужных вложенных циклов.

В частности, я сделал 3 вещи:

  1. Проверяйте каждый элемент в массиве только против каждого последующего элемента, чтобы избежать сравнения одних и тех же объектов более одного раза.
  2. Проверяйте только те элементы, которые не были признаны дубликатами других элементов.
  3. Прежде чем проверять, совпадают ли значения каждого свойства, убедитесь, что оба объекта имеют одинаковые ключи

Вот последняя функция:

-5
Не забудь поставить лайк и подписаться за старания, этим ты очень сильно поддержишь нас!