Избегать рекурсии из-за проблем с памятью, по сути, ошибка. Рассмотрим глубоко вложенный объект, такой как
var obj = {{{{{{{{{thing: 0}}}}}}}}}
В псевдокоде вы можете проверить это на любой глубине, используя
getThing(obj)
if obj == nul return
if obj.thing is defined you're at the bottom
// otherwise
getThing(obj[0])
для каждой рекурсии вся используемая память представляет собой кадр стека: адрес возврата и указатель, в основном. При этом около 18 слов памяти.
То, что вы делаете, по сути, дерево; вам нужно всего лишь lg глубина памяти для рекурсивного исследования глубины дерева; если хотите, lg количество предметов / 2 дополнительной памяти. (Pop викторина: почему это правда?)