Каким образом можно переписать код так, чтобы рекурсия создавала результирующую переменную и возвращала ее в конце? Я использую рекурсию для обхода вложенного дерева, и мне нужно собрать некоторые значения в этой рекурсии. Вместо того, чтобы объявлять переменную вне рекурсии, как это сделано в моем текущем коде, я хочу создать и возвращать переменную внутри рекурсии. Как это сделать?
Например, у меня есть следующий код:
```javascript
let users = {
user1: {
name: 'Mike',
},
user2: {
name: 'Tom',
user3: {
name: 'David',
},
},
}
let result = []
function recur(obj) {
for (let key in obj) {
if (typeof obj[key] !== 'object') {
result.push(obj[key])
} else recur(obj[key])
}
return result
}
console.log(recur(users)) // Результирующий массив
console.log(result) // Не нужно выводить это значение
```
Как я могу переписать этот код так, чтобы переменная `result` была объявлена и возвращена внутри рекурсии?
Для того, чтобы переменная `result` была объявлена и возвращена внутри рекурсии, вы можете передавать и обновлять ее значение как аргумент функции `recur()`.
Вот как можно переделать ваш код:
```javascript
let users = {
user1: {
name: 'Mike',
},
user2: {
name: 'Tom',
user3: {
name: 'David',
},
},
}
function recur(obj, result = []) {
for (let key in obj) {
if (typeof obj[key] !== 'object') {
result.push(obj[key])
} else {
recur(obj[key], result)
}
}
return result
}
console.log(recur(users)) // Результирующий массив
```
В этом коде мы добавляем `result` в качестве дополнительного аргумента в функцию `recur()`, и передаем его при вызове рекурсивной функции `recur()` внутри блока `else`. Таким образом, каждая итерация рекурсии будет иметь доступ к актуальному значению переменной `result`. Начальное значение `result` задано по умолчанию в аргументе функции `recur()`. В конце, мы возвращаем актуальное значение `result` из функции `recur()`.
Теперь `result` объявлен и возвращен внутри рекурсии, а вывод второго `console.log(result)` больше не требуется, так как все результаты уже выведены вместе с первым `console.log(recur(users))`.
function recur(obj, result = []) {
for (let key in obj) {
if (typeof obj[key] !== 'object' || obj[key] === null) {
result.push(obj[key]);
} else {
recur(obj[key], result);
}
}
return result;
}