我有一个用于存储多个值/对象的对象,我希望只有当存储对象中不存在当前节点时才能添加值/节点(我不想要“我“值”覆盖“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]);
}
答案 0 :(得分:1)
您的代码有效,因为您在递归调用时传递对象图节点的直接引用 - 即您正在改变目标对象而不是返回新对象。