Javascript 在展平对象时需要清晰

Javascript 在展平对象时需要清晰,javascript,loops,object,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

我正在为我的应用程序进行对象展平处理。我得到了谷歌的一个函数。但我不能理解它的功能。有人帮我吗

以下是我的疑问和细节:

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"
//观看现场演示


这是一个利用递归的函数

您的第一条评论是:“第一次是地址,但会立即更新。”我不确定您的意思。在本例中,i仅等于“address”

当你说“我第二次打电话,但地址仍然存在……如何?”时,i的值实际上仍然是地址。您只需在地址等于i的情况下,在循环中运行一次这个first for,因为这是对象的唯一属性。您可以看到,在您递归调用阿谀奉承之前,我实际上仍然是地址:

            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没有被覆盖。您需要研究以下主题:递归和闭包范围。javascriptissexy博客是闭包和闭包范围的一个很好的开始。尝试一个包含更多嵌套对象的较大对象,并分析结果。