将两个对象与多个节点组合在一起 - 为什么此代码有效?

时间:2016-01-08 17:41:29

标签: javascript node.js

我有一个用于存储多个值/对象的对象,我希望只有当存储对象中不存在当前节点时才能添加值/节点(我不想要“我“值”覆盖“data.pageData”中的数据集 - 示例中的value1,value2和value3)。我不知道我想添加的节点有多深,所以代码必须处理无限数量的对象级别。这就是我写的,它就像我需要的那样,但我不确定为什么。

我不明白为什么最终返回data.pageData会返回返回的两级或三级深层对象。我认为封装可以防止返回值。

var data = {
    pageData: {
        value1: true,
        value2: 'not an empty string',
        other: {
            value3: false
        }
    }
};

var i = {
    value1: false,
    value2: '',
    other: {
        value3: true,
        value4: {
            value5: true
        },
        value6: 100
    }
};

init('pageData', i);
console.log(JSON.stringify(data));

function init(name, input) {
    if (typeof input !== 'object') {
        console.error('expected input as an object.');
        return;
    }

    var transverseObj = function(i, d) {
        for (var prop in i) {
            if (i.hasOwnProperty(prop)) {
                if (typeof i[prop] === 'object' && typeof d[prop] !== 'undefined') transverseObj.call(transverseObj(i[prop], d[prop]));
                if (typeof d[prop] === 'undefined') d[prop] = i[prop];
            }
        }
        return d;
    };

    //// Check if the storage object is undefined, otherwise run through the object(s)
    data[name] = typeof data[name] === 'undefined' ? input : transverseObj(i, data[name]);
}

1 个答案:

答案 0 :(得分:1)

您的代码有效,因为您在递归调用时传递对象图节点的直接引用 - 即您正在改变目标对象而不是返回新对象。