Сравните массивы объектов, оптимальный способ - PullRequest
5 голосов
/ 08 февраля 2012

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

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

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

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

Ответы [ 3 ]

4 голосов
/ 08 февраля 2012

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

Вам необходимо явно выполнить цикл.

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

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

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

1 голос
/ 07 февраля 2013

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

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

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

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

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

0 голосов
/ 27 июля 2012

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

Вы можете сравнивать объекты или массивы объектов следующим образом:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...