废话不多说直接上代码,新建一个对象。
let obj = {
a: {
A: {
end: true
},
B: 2,
C: 3,
},
b: 2,
c: {
c2: {
cend: 3
}
},
d: 4
};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
深度优先遍历
深度优先遍历,先将obj转化成可迭代对象,在里面执行递归函数,将深层对象作为递归函数的参数传入。
* 对象的深拷贝也可以通过此方法实现。
- 1
- 2
console.log("深度优先遍历")
let DFSARR = [];
// Depth First Search
function DFS(obj) {
if(obj === null || typeof obj !== "object") return;
Object.entries(obj).map(([k, v]) => {
DFSARR.push(k);
if(typeof v === "object") {
DFS(v)
}
})
return DFSARR;
}
console.log(DFS(obj));
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
广度优先遍历
广度优先遍历,先将obj转化成可迭代,执行循环每执行一次减掉一个数组元素,直到数组为空结束
在循环里面将obj深层解构成可迭代对象,并添加到undo数组后面,使之一直解构到没有可迭代对象为止。
- 1
- 2
console.log("广度优先遍历")
let BFSARR = [];
// Breadth First Search
function BFS(obj) {
let undo = [];
if(obj === null || typeof obj !== "object") return;
undo.unshift(obj);
while(undo.length) {
let item = undo.shift();
Object.entries(item).map(([key, val]) => {
BFSARR.push(key)
undo.push(val);
});
};
return BFSARR;
}
console.log(BFS(obj));
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
其上谈到的深拷贝使用递归方式实现?。
//对象深拷贝,递归方式实现
function deepCopy(obj) {
let deepObj = {};
Object.entries(obj).map(([k, v]) => {
if(typeof v === "object") { // 判断深层是否还是对象,如果是的话,将之作为递归函数参数传入。
Object.assign(deepObj, {
[k]: v
});
deepCopy(v);
} else { // 如果不可扩展,直接合并到deepObj
Object.assign(deepObj, {
[k]: v
});
};
});
return deepObj;
};
let obj2 = deepCopy(obj);
// 以下尝试对对象进行修改。
obj2.a = 1;
console.log(obj, obj2); // 检验结果: obj.a 并没有变成1.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
</div>
<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-60ecaf1f42.css" rel="stylesheet">
<div></div>
<div class="person-messagebox">
<div class="left-message"><a href="https://blog.csdn.net/qq_40146880">
<img src="https://profile.csdnimg.cn/3/1/C/3_qq_40146880" class="avatar_pic" username="qq_40146880">
</a></div>
<div class="middle-message">
<div class="title"><span class="tit "><a href="https://blog.csdn.net/qq_40146880" data-report-click="{"mod":"popu_379","ab":"new"}" target="_blank">姚某某。</a></span>
<!-- 等级,level -->
<img class="identity-icon" src="https://csdnimg.cn/identity/blog2.png"> </div>
<div class="text"><span>原创文章 15</span><span>获赞 7</span><span>访问量 2792</span></div>
</div>
<div class="right-message">
<a class="btn btn-sm bt-button personal-watch" data-report-click="{"mod":"popu_379","ab":"new"}">关注</a>
<a href="https://im.csdn.net/im/main.html?userName=qq_40146880" target="_blank" class="btn btn-sm bt-button personal-letter">私信
</a>
</div>
</div>
</div>