javascript之遍历对象

 以下是一个嵌套子对象的对象,遍历类似这样的对象稍微有点复杂,于是把方法写下来,加以巩固,如果学过数据结构应该看得出,遍历方法类似于递归遍历,又像是遍历二叉树。

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);
}

仔细观察就可发现,这三种遍历方式本质上是一致的,只不过遍历和输出的顺序有所差别,不难理解。

猜你喜欢

转载自blog.csdn.net/line233/article/details/81876955