Сгенерировать JSON-патч из двух объектов

Учитывая два объекта Javascript (A и B), есть ли способ сгенерировать заплату JSON, поэтому что когда этот патч применяется к A, он изменит свойства объекта на свойства объекта B?

Например, учитывая гипотетическую функцию JSONPatch (возможно, функцию с таким же именем, как одна из тех, что указаны ниже), нужна функция generate_patch.

patch = generate_patch(A, B) JSONPatch.apply(patch, A) # modifies A so that it has the same properties as B.

В этом вопросе A и B являются объектами Javascript. Патч, созданный RFC6902, представляет собой JSON, указывающий на массив операций, которые при применении к A этому объекту станут B. Однако функция generate_patch не обязательно должна возвращать JSON, скорее, для эффективности она может возвращать объект Javascript, который становится документом RFC6902 JSON-patch, когда для него вызывается JSON.stringify.

Проекты, которые я нашел по теме:


person Brian M. Hunt    schedule 21.03.2014    source источник
comment
Чем это отличается от простого клонирования объекта B?   -  person    schedule 21.03.2014
comment
Вы буквально говорите о JSON (например, текстовой строке) или говорите о превращении одного объекта Javascript в другой. Помните, что JSON — это текстовый формат, который можно преобразовать в объект. Итак, я пытаюсь выяснить, пытаетесь ли вы изменить одну строку JSON на другую или пытаетесь изменить один объект Javascript на другой.   -  person jfriend00    schedule 21.03.2014
comment
@MikeW - патч меньше и представляет собой строку, подходящую для метода HTTP PATCH, в соответствии с RFC6902.   -  person Brian M. Hunt    schedule 21.03.2014
comment
Да, это очень помогает. Вы должны включить это в свой вопрос.   -  person jfriend00    schedule 21.03.2014
comment
Начните здесь: npmjs.org/package/rfc6902   -  person jfriend00    schedule 21.03.2014
comment
@jfriend00 Комментарий добавлен к вопросу - хороший звонок. Отличная ссылка - почитайте.   -  person Brian M. Hunt    schedule 21.03.2014


Ответы (3)


Превратив мой комментарий в ответ...

Этот код https://www.npmjs.org/package/rfc6902 кажется полным javascript реализация как патча, так и diff для заявленного RFC.

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

person jfriend00    schedule 21.03.2014

Начиная с версии 0.3.9, https://github.com/Starcounter-Jack/Fast-JSON-Patch имеет метод compare, который возвращает разницу между двумя объектами. Если я правильно понял, возможно, это то, что вы искали.

person warpech    schedule 30.11.2014

Я также написал библиотеку для создания патчей: https://github.com/gregsexton/json-patch-gen

Я узнал о «rfc6902» после того, как написал и использовал json-patch-gen. Я не уверен, как они сравниваются: возможно, стоит попробовать оба, чтобы увидеть, подходит ли один из них лучше вашим потребностям.

person Greg Sexton    schedule 30.11.2014