Как продвинуть diffs данных (возможно JSON) к серверу?

Чтобы проверить, является ли эта переменная либо null, либо undefined, используйте оператор не равных равных операторов для null.

if (myVar != null) {

}

Однако всегда лучше использовать тройные равные

if (!(myVar === null || typeof myVar === 'undefined')) {

}

Сравнение

(undefined == null) => true
(null == null) => true
(undefined === null) => false
(null === null) => true
(0 == null) => false
(0 == undefined) => false
(0 === null) => false
(0 === undefined) => false
(false == null) => false
(false == undefined) => false
(false === null) => false
(false === undefined) => false
(null) => false
(undefined) => false
(0) => false
(false) => false

DEMO: http://jsfiddle.net/xk9L3yuz/3/

19
задан SCdF 25 February 2009 в 02:55
поделиться

4 ответа

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

редактирование: интересно достаточно это - точно проблема, которой хороший DVCS как Мерзавец занимается, просто не на браузере.

4
ответ дан 30 November 2019 в 05:15
поделиться

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

1
ответ дан 30 November 2019 в 05:15
поделиться

Это было чем-то, с чем я боролся также. Мне остро будет интересно, если кто-либо еще предложит лучший ответ, чем мой, но в настоящее время...

прежде всего, существует http://www.xn--schler-dya.net/blog/2008/01/15/diffing_json_objects/

, я лично не был в состоянии заставить эту библиотеку работать, но Ваш milage может варьироваться.

другая альтернатива не должна пытаться решить проблему с помощью РАЗЛИЧНОГО алгоритма. Это довольно неэффективно, и в зависимости от проблемы, можно получить лучшие метрики производительности, просто отправляющие целый блоб данных, даже если Вы действительно заканчиваете тем, что повторили себя. Это верно главным образом для очень маленьких блоков данных. Очевидно, там будет поворотным моментом как данными, которые необходимо передать, становится больше, но не будет очевидным, где поворотный момент без некоторого измерения. Прием здесь, то, что, чем больше Ваши данные становятся, тем дольше Ваше различное вычисление собирается взять также. Поворотный момент только определяется пересечением этих двух строк, сформированных темпом роста каждого метода, оба из которых будут линейными или хуже, в зависимости от того, как Ваша разность реализована. В худшем варианте развития событий можно видеть остров в середине, где разность получает лучшую производительность, но тогда направляется обратно снова для еще больших наборов данных, и просто отправка его по сети лучше снова.

Следующая остановка прежде, чем попробовать разность, путем обертывания доступа к данным в, "получают", "устанавливают" и "удаляют" методы, которые отслеживают внесенные изменения. Данные, которые Вы отправляете по проводу, по существу были бы последовательным журналом этих использование метода, которое Вы сбрасываете от стороны клиента на каждой успешной передаче. На серверной стороне Вы применяете этот журнал к своим данным серверной стороны с аналогами серверной стороны Вашим методам доступа к данным. Это - несколько более легкое решение, чем разность, которая не требует вполне такой же вычислительной мощности.

Наконец, если Вы собираетесь сделать разность, самый эффективный путь, я могу думать, то, если можно разломать набор данных на дискретные "блоки", каждый с уникальным идентификатором. Тогда при выполнении разности courseness разности точно на уровне "блока". то есть, единственные сравнения, которые Вы сделали бы, являются идентификатором к идентификатору. Если Вы изменяете блок, даете ему новый идентификатор. Скаковая лошадь можно позволить себе сделать различный алгоритм, меньше времени, которое потребуется для выполнения.

, С другой стороны, вместо того, чтобы присвоить новый идентификатор на изменении, Вы могли просто выполнить разность, чтобы проверить, "изменился" ли конкретный объект, резко остановитесь, как только Вы обнаруживаете изменение и просто отмечаете тот блок, который будет снова послан в его полноте, обновит блок на стороне сервера с тем же идентификатором. Это могло быть сделано еще более эффективным, если у Вас есть некоторый быстрый алгоритм хеширования для Ваших блоков, которые можно использовать для быстрого установления равенства.

, Если последовательность Ваших блоков не имеет значения, или если можно сохранить последовательность как свойство самих блоков, а не смоделированный физической последовательностью блоков, тогда можно даже включить блоки идентификатором. Тогда обнаружение различий является просто вопросом списка ключей объекта A, и поиск их на объекте B, и затем Наоборот. Это намного более просто реализовать, чем "реальный" различный алгоритм, он имеет O (a+b) производительность, которая (я думаю), лучше, чем худший вариант развития событий для реального различного алгоритма, который Вы, вероятно, получите, при попытке реализовать его сами или получить плохую реализацию.

5
ответ дан 30 November 2019 в 05:15
поделиться

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

мне любопытно, что там; я боролся с этим точно тем же вопросом, идея "блока" в ответе @Breton состоит отчасти в том, куда я иду, но не уверенный как.

редактирование: ожидайте - я получил это назад, я думал, что Вы говорили о сервере, вычисляющем diffs для отправки клиенту.

, Возможно, Вы могли описать в неопределенных деталях структуру данных по клиенту, который отправляется на сервер. Я не сделал бы этого на основе самого текста JSON если вообще возможный; сделайте diffs из JavaScript. Если это - список объектов с известной структурой, отслеживайте то, которые Вы отправили к серверу и отправляете остальных. Если это - более сложный набор данных, не уверенный, как помочь Вам там.

0
ответ дан 30 November 2019 в 05:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: