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

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

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

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

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

 Jugal21 сент. 2013 г., 09:12

Ответы на вопрос(3)

jQuery.param () который сериализует объекты

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

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

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

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

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

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

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

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

 zozo13 февр. 2013 г., 17:41
Ты прав. +1
Решение Вопроса

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

Вы должны были бы явно зациклить.

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

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

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

 zozo08 февр. 2012 г., 11:51
Есть проблема с производительностью :). Если я сравниваю arr1 == arr2 всегда будет возвращать false, поскольку место в памяти отличается. Мне нужно сравнить память из этого местоположения до конца массива «в терминах памяти», чтобы выразить это так, как во втором расположении до конца. Постскриптум Пожалуйста, извините за мой английский.
 J. K.08 февр. 2012 г., 11:54
Вы не можете напрямую обращаться к памяти, как в C ++. JavaScript - просто тупой интерфейс, и все, что вы можете сделать, это как-то сравнить объекты. я хотел бы использоватьJSON.stringify слишком. Есть такжеuneval.
 zozo08 февр. 2012 г., 11:55
Да ... так что я не могу избежать двух петель. Это отстой. : |
 alex08 февр. 2012 г., 11:54
@zozo Массивы JavaScript - это действительно объекты с некоторыми специальными методами и свойствами. Обычно они не хранятся последовательно, как реализации массивов в других языках.
 pimvdb08 февр. 2012 г., 11:56
JSON.stringify кажется, зависит от порядка, в котором были добавлены свойства.JSON.stringify({a:1,b:2}) === JSON.stringify({b:2,a:1}) доходностьfalse, поэтому я действительно не рекомендую это.

Ваш ответ на вопрос