如果我有这样的对象:
let obj = {
a:{
b:{
c:{
d:{
e:'nonono'
}
}
}
}
}
我知道Object的结构:
现在我想要更改Object的最里层,它是" e"属性。 我想为" e"分配另一个值。 我不想要以下这些方式:
obj.a.b.c.d.e = 'another value';
var str1 = 'a.b.c.d.e';
obj[str1[0]][str[1]][str[2]][str[3]][str[4]];
var str1 = 'obj.a.b.c.d.e';
var str = str1 + "='another value'";
eval(str);
以上,我可以更改属性' e'对象的价值, 但我认为表达我的意思并非恩典。
如果我有这样的数组:
var arr= [a,b,c,d,e]
,我想递归一个函数来找到Object的最内层,但是我试着,如果我到达Object的最内层,我就失去了Object的引用.....所以我可以& #39; t更改我想要的对象值。
如果你可以帮助我跑步,我想我会运行这些代码。
let obj = {
a: {
b: {
c: {
d: {
e: 'nonono'
}
}
}
}
}
let arr = ['a', 'b', 'c', 'd', 'e'];
let funKeepCite = (obj, index) => {
if (obj[arr[index]]) {
funKeepCite(obj[arr[index]], index + 1);
} else {
obj = 'test'
}
}
funKeepCite(obj, 0)
console.log('the result', obj)

我无法更改值,我想我丢失了对象的引用,但我的问题的答案是使用for .. in
,它可以保留对象的引用,我很困惑这些。
答案 0 :(得分:0)
也许你想要这种
let obj = {
a:{
b:{
c:{
d:{
e:'nonono'
}
}
}
}
}
function recurse(obj, val){
for(var k in obj){
if(typeof obj[k] == 'object') recurse(obj[k], val);
else if(typeof obj[k] == 'string') obj[k] = val;
}
}
recurse(obj, 'new');
console.log(obj);

答案 1 :(得分:0)
您无法分配到obj
这只是一个局部变量,您必须分配给一个属性。仅递归到倒数第二个索引,然后使用最后一个索引:
function funKeepCite(obj,index) {
if (index < arr.length - 1) {
funKeepCite(obj[arr[index]], index+1);
} else if (index < arr.length) {
obj[arr[index]] = 'test';
} else
throw new RangeError("there must be at least one property name in the array");
}
}
或者,使用带有返回值的递归并始终指定:
function funKeepCite(obj, index) {
if (index < arr.length) {
obj[arr[index]] = funKeepCite(obj[arr[index]], index+1);
return obj;
} else {
return 'test';
}
}
答案 2 :(得分:0)
我知道这不是最好的方法,但就你的情况而言,&#34; 你已经知道了对象的结构 & #34;
函数setInnerObjVal
将更改obj
中所有最内层对象的值。
let obj = {
a: {
b: {
c: {
d: {
e: 'nonono'
}
}
}
}
//try uncommenting the below codes
/*,
x: {
y: {
z: {
val: 'maybe?'
}
}
}*/
};
function setInnerObjVal(obj1, newVal, callback) {
for (var i in obj1) {
if (typeof obj1[i] == 'object') {
setInnerObjVal(obj1[i], newVal, callback);
} else {
obj1[i] = newVal;
if (typeof callback === 'function')
callback();
return;
}
}
}
//implement a callback to be called when the function is done.
//just in case your object is way way way deeper and you need to wait for the update to finish
var myCallback = function() {
console.log(obj);
//or do something else.
}
setInnerObjVal(obj, 'yesyesyes', myCallback);
//console.log(obj); //this will still log the oldvalue 'nonono' in case obj has a very deep object.
&#13;
注意:强>
此功能将更改obj
下的 所有 对象。 (尝试取消注释值x,y,z,val )