【问题标题】:Need clarity on flattening a object在展平对象时需要清晰
【发布时间】:2014-07-02 06:01:14
【问题描述】:

我正在为我的应用程序进行扁平化对象处理。我得到了谷歌的功能。但我无法理解该功能。有人帮帮我吗?

这是我对细节的疑问:

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

【问题讨论】:

    标签: javascript loops object


    【解决方案1】:

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

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

    当您说“我正在第二次打电话,但地址地址仍然存在......如何?” i 的值实际上仍然是地址。您只在第一次 for in 循环中运行一次,地址等于 i,因为这是对象的唯一属性。你可以看到在你递归调用 flatter 之前 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
    

    【讨论】:

    • 但是在我的控制台上,我第二次得到'i'作为名字。那么这意味着i 被覆盖了对吗? - 我怎么理解这部分?
    • 你是对的,对不起,我将命名但只是为了检查它是否是一个对象,它不是。因此,奉承不是名副其实的。这个函数递归地检查一个属性是否是一个对象,如果是,它正在检查该对象的任何属性是否是对象。每个递归调用都在其自己的闭包范围内引用一个新的 i,i 不会被覆盖。您需要研究以下主题:递归和闭包范围。 javascriptissexy 博客是闭包和闭包范围的一个很好的开始。尝试具有更多嵌套对象的更大对象并分析结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-10
    • 2021-10-27
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多