Обнаружение изменений в сложном объекте

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

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

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

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

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

1 ответ

Решение

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

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

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

Осмотрелся еще немного и нашел еще один пост от stackru с похожим вопросом. Существует решение, похожее на мое, но что мне показалось наиболее интересным, так это второе решение, не выбранное в качестве ответа, я думаю, оно имеет то, что вам нужно: сравнение объектов в JavaScript

Другие вопросы по тегам