- PVSM.RU - https://www.pvsm.ru -
Вот JavaScript-овый объект, сериализованный в JSon:
var source1 = '[{"vConfig":{"vType":"objectview","serverItemType":"TrackerObject"}}]';
А вот ещё один JavaScript-овый объект, тоже сериализованный в JSon:
var source2 = '[{"vConfig":{"serverItemType":"TrackerObject","vType":"objectview"}}]';
У них одинаковая структура, одинаковые параметры, одинаковые значения в этих параметрах. По всем признакам, и в source1
, и в source2
у нас одно и то же.
Но интерпретатор JavaScript с нами, разумеется, не согласен. И он вполне резонно считает, что source1 и source2 — разные строки. А если мы десериализуем их обратно, то получим два object-а, которые расположены по различным адресам памяти и… тоже не равны друг другу.
А если вы, впридачу, работает с Ext.js, щедро генерируете свои классы и не забываете про jSon, то может дойти до полного затмения. Как сравнить эти огромные простыни сведений о контролах, которые собираются в JSon-ы? Или разобраться древовидными объектами, где в каждое поле уже успели насоздаваться ещё какие-то подполя?
Выход один — нужно найти способ сравнивать не по значению, не по ячейке в памяти, а более гибко. Равными должны считаться те объекты, у которых одинаковые поля содержат одинаковые значения. С этой точки зрения наш source1
безусловно равен source2
.
Так и родился на свет очередной велосипед — JSonCmp [1]. Простая, и очень нужная функция для сравнения объектов в JavaScript. Разумеется, я находил много попыток написать такую, но каждая из реализаций решала только часть проблемы — в итоге я свёл все интересные идеи в одну, попутно добавив пару своих…
Использовать его просто — достаточно подключить jsoncmp.js, и потом вызвать:
jSonCom(object1, object2);
Если объекты содержат одну и ту же информацию, функция вернёт true. Иначе — false.
Пользователи Ext.js могут использовать тот же самый алгоритм, но в обёртке плагина — jsoncmp.ext.js. Код будет выглядеть так:
Ext.ux.util.Object(object1, object2);
Правила сравнения такие:
jSonCmp([ 1, 2, 3, 4, 5 ], [ 1, 2, 3, 5, 4 ], { arraysAsSets : true })); # - true
По умолчанию arraysAsSets выставлено в false.
Я надеюсь, что это небольшая и наверняка несовершенная функция чуть-чуть, но упростит вашу работу.
Автор: RikkiMongoose
Источник [2]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/30284
Ссылки в тексте:
[1] JSonCmp: https://github.com/rikkimongoose/JSonCmp/
[2] Источник: http://habrahabr.ru/post/174091/
Нажмите здесь для печати.