Используйте обход в глубину с явным стеком: числовые значения прибавляйте к сумме, значения объекта отправляйте на дальнейшую обработку. Для примера сумма равна 9.
Как обойти объект с произвольной вложенностью?
Используйте обход в глубину с явным стеком: числовые значения прибавляйте к сумме, значения объекта отправляйте на дальнейшую обработку. Для примера сумма равна 9.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Дан конечный ациклический объект JavaScript из вложенных обычных объектов и числовых листьев: {a: 2, b: {c: 3, d: {e: 4}}}. Нужно найти сумму всех чисел независимо от глубины, не меняя исходник. Как обобщить решение для одного уровня?
Ответ
Используйте обход в глубину с явным стеком: числовые значения прибавляйте к сумме, значения объекта отправляйте на дальнейшую обработку. Для примера сумма равна 9.
function sumLeaves(root) {
const stack = [root];
let sum = 0;
while (stack.length) {
const value = stack.pop();
if (typeof value === 'number') sum += value;
else if (value !== null && typeof value === 'object') {
stack.push(...Object.values(value));
}
}
return sum;
}
Время O(N) по числу значений. Явный стек избегает глубокой рекурсии, но для очень широких объектов лучше добавлять дочерние значения циклом вместо spread. Циклы исключены условием; иначе нужен контроль посещённых объектов.