以下是一个嵌套子对象的对象,遍历类似这样的对象稍微有点复杂,于是把方法写下来,加以巩固,如果学过数据结构应该看得出,遍历方法类似于递归遍历,又像是遍历二叉树。
var tree = { //一棵树
"id": 0,
"name": "root",
"left": {
"id": 1,
"name": "Simon",
"left": {
"id": 3,
"name": "Carl",
"left": {
"id": 7,
"name": "Lee",
"left": {
"id": 11,
"name": "Fate"
}
},
"right": {
"id": 8,
"name": "Annie",
"left": {
"id": 12,
"name": "Saber"
}
}
},
"right": {
"id": 4,
"name": "Tony",
"left": {
"id": 9,
"name": "Candy"
}
}
},
"right": {
"id": 2,
"name": "right",
"left": {
"id": 5,
"name": "Carl",
},
"right": {
"id": 6,
"name": "Carl",
"right": {
"id": 10,
"name": "Kai"
}
}
}
};
将上述所示对象整理成结构图如上所示 //要求一: 假设id和name均不会重复,根据输入name找到对应的id
findIdByName("Kai");
function findIdByName(name) {
var id;
function findName(obj) {
if (obj != null) {
if (obj.name === name) {
id = obj.id;
console.log(id);
}
findName(obj.left);
findName(obj.right);
}
}
findName(tree);
}
//要求二: 假设id和name均不会重复,根据输入id找到对应的name,与要求一相同,不过还是把代码贴上了
findNameById(2);
function findNameById(id) {
var name;
function findName(obj) {
if (obj != null) {
if (obj.id === id) {
name = obj.name;
console.log(name);
}
findName(obj.left); //递归遍历,相当于遍历左子树
findName(obj.right);//遍历右子树
}
}
findName(tree);
}
三种遍历方式遍历对象
I.前序遍历
// 把这个对象中所有的名字以“前序遍历”的方式全部输出到console中
getListWithDLR();
function getListWithDLR() {
function preTraversal(obj) {
if(obj!=null) {
console.log(obj.name);
preTraversal(obj.left);
preTraversal(obj.right);
}
}
preTraversal(tree);
}
II.中序遍历
// 把这个对象中所有的名字以“中序遍历”的方式全部输出到console中
getListWithLDR();
function getListWithLDR() {
function midTraversal(obj) {
if(obj!=null) {
midTraversal(obj.left);
console.log(obj.name);
midTraversal(obj.right);
}
}
midTraversal(tree);
}
III.后序遍历
// 把这个对象中所有的名字以“后序遍历”的方式全部输出到console中
getListWithLRD();
function getListWithLRD() {
function postTraversal(obj) {
if(obj!=null) {
postTraversal(obj.left);
postTraversal(obj.right);
console.log(obj.name);
}
}
postTraversal(tree);
}
仔细观察就可发现,这三种遍历方式本质上是一致的,只不过遍历和输出的顺序有所差别,不难理解。