废话不多说直接上代码,新建一个对象。
let obj = {
a: {
A: {
end: true
},
B: 2,
C: 3,
},
b: 2,
c: {
c2: {
cend: 3
}
},
d: 4
};
深度优先遍历
深度优先遍历,先将obj转化成可迭代对象,在里面执行递归函数,将深层对象作为递归函数的参数传入。
* 对象的深拷贝也可以通过此方法实现。
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));
广度优先遍历
广度优先遍历,先将obj转化成可迭代,执行循环每执行一次减掉一个数组元素,直到数组为空结束
在循环里面将obj深层解构成可迭代对象,并添加到undo数组后面,使之一直解构到没有可迭代对象为止。
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));
其上谈到的深拷贝使用递归方式实现?。
//对象深拷贝,递归方式实现
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.