需要清晰地展平对象

时间:2014-07-02 06:01:15

标签: javascript loops object

我正在为我的应用程序做一个展平对象过程。我得到了谷歌的功能。但我无法理解这个功能。任何人帮助我?

这是我对细节的怀疑:

var object = {
    "address" : {
        "name" : "siva"
    }
};


var flatter = function (ob) {
    var newObj = {};
    for(var i in ob) { //first time will be address but it will update immediately
        console.log(i,'1')
        if((typeof ob[i]) == 'object') {
            var cObj = flatter(ob[i]); // i am calling 2nd time, but still address is exist..how?
            for(var x in cObj) {
                console.log(i, x,'2')
                newObj[i + '.' + x] = cObj[x]; //now `i` became name, but i am getting address with name where the address label stored?
            }
        } 
        else {
            newObj[i] = ob[i];
        }

        if (($.type(ob[i])) == 'null') {
            newObj[i] = ob[i];
        }
    }
    return newObj;
};

console.log(flatter(object)); // i am getting proper result as : address.name: "siva"

//查看现场演示。

Live Demo

1 个答案:

答案 0 :(得分:1)

这是一个利用递归的函数。

您的第一条评论说:"第一次将是地址,但会立即更新。"我不确定你的意思。我只是等于“地址”。在这个例子中。

当你说"我正在第二次拨打电话时,但地址仍然存在......怎么样?" i的价值实际上仍然是地址。您只能在地址等于i的情况下首次运行此循环,因为这是该对象的唯一属性。在递归调用奉承之前,你可以看到我实际上仍然是地址:

            console.log('i', i);       // address
            var cObj = flatter(ob[i]); 

接下来,当你说地址现在是名称时,它实际上仍是地址,x等于名称。您可以在下面看到:

            for(var x in cObj) {
                newObj[i + '.' + x] = cObj[x];
                console.log('i: ', i);    // i: address
                console.log('x: ', x);    // x: name