Я пишу компилятор в JavaScript, а для оптимизатора я следую обычному шаблону, где список оптимизаций повторяется до тех пор, пока ничего не произойдет. Очевидным способом определения условия «ничего не происходит» является то, что каждая оптимизация устанавливает флаг, если он успешно что-то делает. Мне интересно, есть ли более элегантный способ сделать это.Обнаружение изменений в сложном объекте
Реферат может быть сформулирован так: заданный сложный объект (со многими уровнями подобъектов, включая массивы с круговыми ссылками и т. Д.), Запустите его через возможное преобразование, затем определите, что-либо изменилось. Поэтому возникает вопрос, существует ли простой способ обнаружения изменений в сложном объекте.
Watch.js предоставляет способы обнаружения изменений в объекте, но только на верхнем уровне, и будет срабатывать, если поле изменяется, даже если оно впоследствии возвращается к его исходному значению.
Другим подходом было бы сделать глубокую копию объекта, а затем глубоко сравнить с оригиналом. Однако, из других вопросов здесь, глубокая копия выглядит как нетривиальная операция, а глубокое сравнение имеет свои проблемы.
Есть ли элегантный трюк, который мне не хватает, или я должен просто придерживаться того, чтобы каждый прогон оптимизации выполнял свой собственный учет?
Backbone.js имеет этот встроенный модуль. http://backbonejs.org/#Model-changedAttributes –
@Diodeus Интересно! Я получаю впечатление от документации, что он видит только изменения атрибутов верхнего уровня, но не изменения в подобъектах? – rwallace
Просто мозговой штурм: что бы вы ни использовали для обнаружения изменений на верхнем уровне, не могли бы вы просто применить это к каждому массиву и подобъекту внутри вашего исходного объекта? – basilikum