首页 > javascript中如何通过遍历对象属性来修改局部变量的值?

javascript中如何通过遍历对象属性来修改局部变量的值?

问题的逻辑属于实验性质,不需要讨论它的合理性,问题背景为:
在一个函数中,我定义了多个局部变量,然后定义了一个json对象,json对象中的属性和定义的局部变量构成一一对应的关系。

function testFn(){
    var name='nihao';//定义的局部变量
    var age=18;//定义的局部变量
    var height=172;//定义的局部变量
    var obj={//定义的json对象,属性名和上面的其他局部变量构成一一对应的关系
        'name':'obj_nihao',
        'age':20,
        'height':183
    }
    for(var i in obj){
        //通过i来识别到局部变量,比如i为'name'时,让name=obj.name
        //让obj中的属性修改局部变量的值
    }
    console.log(name,age, height);
}
testFn();

现在想让obj一级属性一一对应的去修改局部变量的值,比如让obj.name去修改name变量的值,obj.age去修改age变量的值,以此类推。可惜我并没有找到解决方案。
现在我写了一个并不优雅,也不是我追求的自动识别的方案,代码如下:

function testFn(){
    var name='nihao';//定义的局部变量
    var age=18;//定义的局部变量
    var height=172;//定义的局部变量
    var obj={//定义的json对象,属性名和上面的其他局部变量构成一一对应的关系
        'name':'obj_nihao',
        'age':20,
        'height':183
    }
    'name,age,height'.split(',').forEach(function(item,index){
        switch(index){
           case 0:name=obj[item];break;
           case 1:age=obj[item];break;
           case 2:height=obj[item];break;
        }
    });
    console.log(name,age, height);
}
testFn();

这段代码也是傻的可怜,可惜确实没有找到识别这些变量值为值类型的变量的名字的方案,说的好绕口。

这个问题有点奇怪,是我在封装UI组件时思考的问题,希望大神们不惜赐教,大家一起来讨论分析下。


function testFn() {
  this.name = 'nihao'; //定义的局部变量
  this.age = 18; //定义的局部变量
  this.height = 172; //定义的局部变量
  var obj = { //定义的json对象,属性名和上面的其他局部变量构成一一对应的关系
    'name': 'obj_nihao',
    'age': 20,
    'height': 183
  }
  Object.keys(obj).forEach(function(v,i){
    this[v] = obj[v]
  })
  console.log(name, age, height);
}
testFn();
// obj_nihao 20 183

符合你的要求但是是bad practice :)

function testFn(){
    var name='nihao';//定义的局部变量
    var age=18;//定义的局部变量
    var height=172;//定义的局部变量
    var obj={//定义的json对象,属性名和上面的其他局部变量构成一一对应的关系
        'name':'obj_nihao',
        'age':20,
        'height':183
    }
    var source = testFn.toString()
    for (var i in obj) {
        var re = new RegExp("var\\s*" + i + "\\s*=\\s*.*"); \\ 这个匹配变量不完美:(
        if (source.match(re) && source.match(re).length !== 0) {
          var newValue = (typeof obj[i] === 'string' || typeof obj[i] === 'object') 
                     ? JSON.stringify(obj[i])
                     : obj[i]
          var newCode = "var " + i + "=" + newValue
          eval(newCode)
      }
    }
    console.log(name);
    console.log(age);
    console.log(height)

}
testFn(); // obj_nihao 20 183

我觉得这个问题本身就别扭,你完全可以使用callback的方式来解决或者写一个业务封装类吧。

【热门文章】
【热门文章】