Javascript:使用遍历从JSON对象获取引用

X.Q*_*ang 2 javascript traversal object

我需要从JSON对象获取引用,代码如下:

var Tree = {
    data: {
        0: {
            pk: 1,
        },
        1: {
            pk: 2,
        },
        2: {
            pk: 3,
            children: {
                0: {
                    pk: 11,
                },
                1: {
                    pk: 22,
                },
                2: {
                    pk: 33,
                },
            },
        },
    },

    traverse: function(data, pk) {
        for (i in data) {
            // console.log(data[i]);
            if(data[i].pk && data[i].pk == pk)
                return data[i];

            if (typeof(data[i].children) == 'object')
                this.traverse(data[i].children, pk);
        };
    },
}

遍历顶级项目时,代码运行良好:

>>> Tree.traverse(Tree.data, 1);
Object {pk=1}

但是当得到子元素时坏了:

>>> Tree.traverse(Tree.data, 22);
undefined

当你取消注释'// console.log(data [i]);'时,我很奇怪为什么会出现这种情况?你会看到该对象已被获取但未返回.

有什么想法吗?

aul*_*ron 6

你没有把return之前this.traverse(data[i].children, pk);.


编辑:

var Tree = {
    data: {
        0: {
            pk: 1,
        },
        1: {
            pk: 2,
        },
        2: {
            pk: 3,
            children: {
                0: {
                    pk: 11,
                },
                1: {
                    pk: 22,
                },
                2: {
                    pk: 33,
                },
            },
        },
    },

    traverse: function(data, pk) {
        for (var i in data) {
            // console.log(data[i]);
            if(data[i].pk && data[i].pk == pk)
                return data[i];

            if (typeof(data[i].children) == 'object') {
                var retVal = this.traverse(data[i].children, pk);
                if (typeof retVal!='undefined') {//here was the logical problem,there might be more than one
                                                 //object, we can't return the result of traversing first one.
                                                 //So we will check, if no return, we go on searching
                    return retVal;
                }
            }

        };
    },
};

alert(Tree.traverse(Tree.data, 1).pk);
alert(Tree.traverse(Tree.data, 22).pk);
Run Code Online (Sandbox Code Playgroud)

在这里查看:http://jsfiddle.net/rq4LK/