将两个对象与多个节点组合在一起——为什么这段代码有效
Combing two objects with multiple nodes - why does this code work?
我有一个用于存储多个值/对象的对象,只有当存储对象中不存在当前节点时,我才希望能够添加值/节点(我不希望"I"值覆盖"data.pageData"中的数据集-示例中的值1、值2和值3)。我不知道我想添加的节点有多深,所以代码必须处理无限数量的对象级别。这就是我写的,它就像我需要它一样工作,但我不知道为什么。
我不明白为什么最后返回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]);
}
您的代码之所以有效,是因为您在递归调用中传递对象图节点的直接引用,即您在原地更改目标对象,而不是返回新对象。
相关文章:
- 为什么jQuery代码段在没有IFrame的情况下可以工作,而在有IFrame时却不能工作
- 为什么这两段代码返回的值不同
- 在这段代码中:为什么e被定义在定义e的括号中
- JavaScript-为什么这段代码不起作用
- 为什么这段代码会导致使用phantom模块的Node.js挂起
- 为什么这段代码中有反斜杠
- 为什么这段代码只有在 isNaN 放在最后时才有效
- 为什么这段代码使用 JavaScript 的.aspx文件
- 为什么这段代码不起作用?Javascript
- 为什么这段代码在FireFox和IE中不起作用,但在Chrome中却有效
- 为什么这段代码给我空白页
- 为什么这段代码在火狐中运行缓慢
- 请问为什么这段代码在 onclick 事件后刷新我的页面
- 为什么这段代码卡住了节点.js - Javascript上的错误
- 为什么这段代码在这里工作,但在 JSFiddle 上不起作用
- Javascript为什么IE不执行这段代码
- (杰奎里)我想知道为什么这段代码不起作用
- 为什么这段代码有时会使浏览器崩溃
- 为什么这段代码没有加载页面ajax jquery
- 为什么这个代码段不起作用