Различие двух состояний строки или массива - PullRequest
0 голосов
/ 18 февраля 2020

Для строки и массива у меня есть «старое» состояние и «новое» состояние (после некоторых изменений).

Мне нужно часто отправлять на сервер (с AJAX / XMLHttpRequest) изменения, если это возможно, эффективным способом (не отправляйте повторно 200 КБ данных, если только один элемент в массиве был изменен / был удален / был перемещен). Пример:

var oldstate1 = 'hello how are you? very good and you? thanks for asking! this text will be removed.';
var newstate1 = 'hello how are you? very good and you? new text here. thanks for asking!';

var oldstate2 = [[1732, "item1"], [1732, "will be deleted"], [23, "will be moved"], [23, "hello"]];
var newstate2 = [[23, "will be moved"], [1732, "item1"], [23, "hello"], [126, "new item"]];

Конечно, я мог бы вручную кодировать протокол между клиентом и сервером с такими событиями, как delete, insert, move, update и т. Д. c. и отправьте эти события с AJAX, и сервер соответствующим образом обновит свою базу данных. Но это довольно утомительно, чтобы делать правильно.

Вопрос: есть ли более умный способ кодировать изменения только между oldstate и newstate большой строки или массива с Javascript? таким образом, чтобы его можно было легко декодировать в бэкэнде, используя Python.

Нечто подобное алгоритму diff/patch для строк или массивов, понимаемое между JS (на стороне клиента) и Python (back-end).

Примечание:

1 Ответ

0 голосов
/ 18 февраля 2020

Вероятно, это возможно без стороннего инструмента (если так, не стесняйтесь опубликовать другой ответ).

После дальнейших исследований я нашел этот проект: diff-match-patch и особенно этот пример .

Созданная в 2006 году для работы с Документами Google, эта библиотека теперь доступна на C ++, C#, Dart, Java, JavaScript, Lua, Объектив C и Python.

var oldstate1 = "hello how are you? very good and you? blablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablabla. thanks for asking! this text will be removed.";
var newstate1 = "hello how are you? very good and you? blablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablabla.new text here. thanks for asking!";
var dmp = new diff_match_patch();
var diff = dmp.diff_main(oldstate1, newstate1);
dmp.diff_cleanupSemantic(diff);
console.log(dmp.diff_toDelta(diff))    
// =138	+new text here.	=19	-27
<script src="https://cdnjs.cloudflare.com/ajax/libs/diff_match_patch/20121119/diff_match_patch.js"></script>

Этот delta + oldstate1 может затем использоваться на стороне сервера, с Python, для восстановления newstate1:

import diff_match_patch as dmp_module
dmp = dmp_module.diff_match_patch()

oldstate1 = "hello how are you? very good and you? blablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablabla. thanks for asking! this text will be removed."
delta = "=138\t+new text here.\t=19\t-27"
patch = dmp.patch_make(oldstate1, dmp.diff_fromDelta(oldstate1, delta))
newstate1 = dmp.patch_apply(patch, oldstate1)[0]
print(newstate1)

См. Также этот номер .

...