js对象的属性名是变量,除了使用eval,还有没有别的方式获取属性值

例如,有一个对象:

var china={
    beijing:{
        chaoyang:{
            number:1234
        }
    }
}

现有一拼凑出的变量:

var key = "beijing.chaoyang.number"

所以可以通过

eval("china."+key)

来获取number。

想知道除了eval之外,有没有其他方法实现相同效果。

使用slice的方式将字符串分隔成["beijing","chaoyang","number"],然后用china"beijing"["number"]的方法倒可行,但实际情况是层级不是固定的,需要增加多个判断,所以暂不考虑。

阅读 4.7k
5 个回答

实际上就是一个递增查询,reduce 方法可以记录上一次结果继续操作;一般来说不到万不得已不用 eval(),万不得已的情况很少的。。。

var china={
    beijing:{
        chaoyang:{
            number:1234
        }
    }
};
var key = "beijing.chaoyang.number";

let data=key.split(/\./g).reduce((result,val)=>{
    return result=result[val];
},china);

console.log(data);//1234

写一个函数 亲测有效

 var a = '123'
 function evil(fn) {
     var Fn = Function; 
     return new Fn('return ' + fn)();
 }
 console.log(evil(a))  //123  number

你可以通过var obj = {};obj[key+'xxxx'] = 'vvvvvvvvvvvv';来调用探读

const getDeepValue = (p, o) => p.reduce((xs, x) => (xs && xs[x]) ? xs[x] : null, o);
var china={
    beijing:{
        chaoyang:{
            number:1234
        }
    }
}
console.log(getDeepValue(['beijing', 'chaoyang', 'number'], china));  //1234
var china = {
    beijing: {
        chaoyang: {
            number: 1234
        }
    }
};

var key = "beijing.chaoyang.number";

function getData (father, key) {
    var keyArr = key.split('.');
    var result = father;
    for(var a=0; a<keyArr.length; a++) {
        result = result[keyArr[a]];
    }
    return result;
}

console.log(getData(china, key)); // 1234
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题