2014-01-03 4 views
1

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

Реферат может быть сформулирован так: заданный сложный объект (со многими уровнями подобъектов, включая массивы с круговыми ссылками и т. Д.), Запустите его через возможное преобразование, затем определите, что-либо изменилось. Поэтому возникает вопрос, существует ли простой способ обнаружения изменений в сложном объекте.

Watch.js предоставляет способы обнаружения изменений в объекте, но только на верхнем уровне, и будет срабатывать, если поле изменяется, даже если оно впоследствии возвращается к его исходному значению.

Другим подходом было бы сделать глубокую копию объекта, а затем глубоко сравнить с оригиналом. Однако, из других вопросов здесь, глубокая копия выглядит как нетривиальная операция, а глубокое сравнение имеет свои проблемы.

Есть ли элегантный трюк, который мне не хватает, или я должен просто придерживаться того, чтобы каждый прогон оптимизации выполнял свой собственный учет?

+1

Backbone.js имеет этот встроенный модуль. http://backbonejs.org/#Model-changedAttributes –

+0

@Diodeus Интересно! Я получаю впечатление от документации, что он видит только изменения атрибутов верхнего уровня, но не изменения в подобъектах? – rwallace

+0

Просто мозговой штурм: что бы вы ни использовали для обнаружения изменений на верхнем уровне, не могли бы вы просто применить это к каждому массиву и подобъекту внутри вашего исходного объекта? – basilikum

ответ

1

Я бы просто опубликовал это как комментарий, но у меня нет необходимого представителя.

Я не знаю, если это будет работать в вашей ситуации, но то, что вы могли бы сделать, это преобразовать в формат JSON, а затем сравнить строки:

JSON.stringify(firstObject) === JSON.stringify(secondObject) 

осматривал немного больше, и нашел другой StackOverflow сообщение с аналогичным вопросом. Существует решение, подобное моему, но то, что я нашел наиболее интересным, было вторым решением, не выбранным в качестве ответа, я думаю, он имеет то, что вам нужно: Object comparison in JavaScript

Смежные вопросы