【发布时间】:2018-02-07 16:33:24
【问题描述】:
我在构建一个递归函数来钻取对象时遇到了这个问题。给定一个对象和路径(作为字符串数组):
const path = ['path', 'to', 'nestedObj', 'someProp'];
const obj = {
path: {
to: {
nestedObj: {
someProp: 'someValue'
}
}
}
}
我想出了这个解决方案:
function setValueFromPath(object, path, value) {
let nestedObj = object[path[0]];
const nextPath = path.slice(1, path.length);
if(path.length > 1) {
return setValueFromPath(nestedObj, nextPath, value);
}
nestedObj = value;
}
但是,它并没有将值重新分配给某些道具。对我来说,这意味着最后一行,nestedObj = value,nestedObj 没有持有对原始 obj 的引用。
所以我做了一些摆弄并尝试了这个:
function setValueFromPath(object, path, value) {
let nestedObj = object[path[0]];
const nextPath = path.slice(1, path.length);
if(path.length > 2) {
return setValueFromPath(nestedObj, nextPath, value);
}
nestedObj[path[1]] = value;
}
在这种情况下,这确实会改变原始对象(预期行为)。我的问题:为什么这个nestedObj 似乎持有对原始对象的引用,而不是第一个解决方案中的第一个?我认为这与递归函数没有任何关系。但我有点困惑,想知道是否有人可以解释一下。
【问题讨论】:
-
使
nestedObj指向不同的对象不会影响它曾经指向的对象。 -
我不相信,这个问题与内存中的引用有关
-
不存在未定义的隐式返回吗?我的意思是该功能有效,这不是我的问题是关于 0.0
-
这个变量很好地保存了引用。当你重写一个引用时,你重写了引用,而不是它指向的对象。顺便说一句:
for(const sub of path) object = object[sub];
标签: javascript