javascript - 深度克隆时,这种递归如何工作?
问题描述
此代码来自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}
}
解决方案
你应该把这看作是一个树数据结构问题,一个对象有 x 个子属性,每个子属性还有 x 个子属性,依此类推……对于每个子对象,这个子对象都会生成一个特定的子树,所以你可以为每个孩子递归调用此函数,因为每个孩子都有自己的属性树。为了更多地了解这种类型的算法,您应该查看Trees。
推荐阅读
- git - 如何重新同步 git repos
- ios - UIKit 布局子视图,即使它没有被要求
- java - 如何在spring boot中区分名称相同但查询参数不同的edpoints
- html - Chart.js 时间序列
- oracle - Oracle Apex 5.1 显式调整卡片大小并将卡片限制为每行一张
- speech-recognition - 使用 Kaldi-ASR 识别语音命令?
- javascript - panTo() 方法干扰 Google Maps Javascript API 中的弹跳动画
- php - 将字符串拆分为 3 个随机长度的部分
- flutter - 在 Flutter 中实现 Blockly 小部件
- intellij-idea - 无法从 InteliJ UI 提交和推送恢复的提交到 bitbucket