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

Каким образом можно переписать код так, чтобы рекурсия создавала результирующую переменную и возвращала ее в конце? Я использую рекурсию для обхода вложенного дерева, и мне нужно собрать некоторые значения в этой рекурсии. Вместо того, чтобы объявлять переменную вне рекурсии, как это сделано в моем текущем коде, я хочу создать и возвращать переменную внутри рекурсии. Как это сделать? 

Например, у меня есть следующий код:

```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` была объявлена и возвращена внутри рекурсии?
  • 30 сентября 2023 г. 11:37
Ответы на вопрос 2
Для того, чтобы переменная `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;
}
Похожие вопросы