Сравнение массивов объектов, оптимальный способ

У меня есть два массива. В каждом массиве у меня есть объекты с большим количеством свойств, но без методов. Мне нужно увидеть, равен ли массив 1 массиву 2.

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

Проблема в том, что массивы довольно большие, и каждый объект имеет множество свойств. Я блуждал, если мог быть другой путь. В С++, например, я мог читать память... но я не знаю, как это сделать в js.

Мне нужно получить наиболее оптимальный путь, поскольку это часть часто используемой функции.

Ответ 1

Если они не являются одним и тем же экземпляром массива, сравнение местоположений памяти в JavaScript не будет работать (что происходит, когда вы делаете arr1 == arr2).

Вам понадобится явно цикл.

Некоторые люди используют JSON.stringify() (следите за тем, чтобы получить объяснение в комментариях pimvdb) на обоих массивах и сравнить полученные строки с обманом, но сериализация на строку и сравнение звуков по сравнению со мной в целом дорого. Однако он работает, поэтому, если нет проблем с производительностью, перейдите в орехи!:)

Вы также можете попробовать toSource().

Я бы построил свою собственную сравнительную функцию, которая сравнивает только то, что удовлетворяет моей идее идентичности.

Ответ 2

Преобразование ваших массивов в строки, а затем сравнение строк будет иметь одинаковую среднюю и худшую производительность: O (n) (линейный).

Если вы пройдете через свои свойства/массивы объектов и прервите первое несоответствие, худшая производительность будет равна O (n), но ваша средняя производительность может значительно улучшить, если объекты, которые вы сравниваете, обычно идентичны. В любом случае, поскольку этот обход не будет включать в себя создание каких-либо новых объектов и копирование байтов вокруг - даже сравнение идентичных составных объектов/массивов (худший случай) должно все же быть быстрее, чем их строение.

Как этот ответ предлагает вам просто использовать Underscore.js isEqual:

который согласно документам: Выполняет оптимизированное глубокое сравнение между двумя объектами, чтобы определить, должны ли они считаться равными

Я уверен, что он будет работать и для массивов.

Ответ 3

JQuery имеет функцию jQuery.param(), которая сериализует объекты

Вы можете сравнивать объекты или массивы таких объектов,

$.param( originalObj ) == $.param( modifiedObj )

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