Рекурсивные функции могут сбивать с толку.Несколько хорошо размещенных console.log()
s или запуск кода в отладчике могут действительно помочь.Функция создает newObject
для исходного объекта и каждого дочернего объекта в объекте .Когда рекурсия раскручивается, она устанавливает свойство в родительском элементе в результате рекурсивного вызова дочернего элемента.
Вы можете увидеть эффект в console.logs здесь:
const o = {
a: 'a',
b: 'b',
obj: {
key: 'key',
deeper: {one: 1, two: 2}
},
}
// deep copy
function deepCopy(obj) {
console.log("deep copy of: ", obj)
const keys = Object.keys(obj)
const newObject = {}
for (let i = 0; i < keys.length; i++) {
const key = keys[i]
if (typeof obj[key] === 'object') {
console.log("setting child of", key, "to:")
newObject[key] = deepCopy(obj[key])
} else {
newObject[key] = obj[key]
}
}
return newObject
}
console.log("starting with")
const o4 = deepCopy(o)
Каждая из строк, начинающаяся с deep copy of
, указывает на вновь созданный newObject
в рекурсивном вызове, но единственный возвращаемый newObject
- первый - вседругие становятся детьми.