首页 > 解决方案 > 深度克隆时,这种递归如何工作?

问题描述

此代码来自https://javascript.info/object-copy

function cloneDeep(obj) {
  let clone = {};
  for (let key in obj) {
    if (typeof obj[key] === "object") {
      clone[key] = cloneDeep(obj[key]);
    } else {
      clone[key] = obj[key];
    }
  }
  return clone;
}

let user = {
  name: "John",
  sizes: {
    height: 182,
    width: 50,
  },
};

console.log(cloneDeep(user));

我不太明白这个递归是如何在第 5 行工作的。对于 obj 中的每个键(所以高度和大小),如果对象中有一个对象,它会cloneDeep()再次运行EACH TIME。在第 2 行,它再次初始化 clone = {}。

cloneDeep()如果它同时针对高度和宽度运行,我无法理解为什么输出不是这样的:

{name: "John",
  sizes: {height: 182},
  sizes: {width: 50}
}

标签: javascriptrecursion

解决方案


你应该把这看作是一个树数据结构问题,一个对象有 x 个子属性,每个子属性还有 x 个子属性,依此类推……对于每个子对象,这个子对象都会生成一个特定的子树,所以你可以为每个孩子递归调用此函数,因为每个孩子都有自己的属性树。为了更多地了解这种类型的算法,您应该查看Trees


推荐阅读