Сравнение массивов объектов, оптимальный способ
У меня есть два массива. В каждом массиве у меня есть объекты с большим количеством свойств, но без методов.
Мне нужно увидеть, равен ли массив 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(), который можно использовать для клонирования объектов