如果我已经知道对象的结构,我该如何评估对象的正确值?(javascript)

时间:2017-08-15 05:53:31

标签: javascript

如果我有这样的对象:

let obj = {
  a:{
    b:{
      c:{
        d:{
         e:'nonono'
       }
     }
   }
 }
}

我知道Object的结构:

现在我想要更改Object的最里层,它是" e"属性。 我想为" e"分配另一个值。 我不想要以下这些方式:

  1. obj.a.b.c.d.e = 'another value';
  2. var str1 = 'a.b.c.d.e'; obj[str1[0]][str[1]][str[2]][str[3]][str[4]];
  3. var str1 = 'obj.a.b.c.d.e'; var str = str1 + "='another value'"; eval(str);
  4. 以上,我可以更改属性' 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,它可以保留对象的引用,我很困惑这些。

3 个答案:

答案 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中所有最内层对象的值。

&#13;
&#13;
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;
&#13;
&#13;

注意:

此功能将更改obj下的 所有 对象。 (尝试取消注释值x,y,z,val