鍍金池/ 問(wèn)答/HTML/ js對(duì)象的屬性名是變量,除了使用eval,還有沒(méi)有別的方式獲取屬性值

js對(duì)象的屬性名是變量,除了使用eval,還有沒(méi)有別的方式獲取屬性值

例如,有一個(gè)對(duì)象:

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

現(xiàn)有一拼湊出的變量:

var key = "beijing.chaoyang.number"

所以可以通過(guò)

eval("china."+key)

來(lái)獲取number。

想知道除了eval之外,有沒(méi)有其他方法實(shí)現(xiàn)相同效果。

使用slice的方式將字符串分隔成["beijing","chaoyang","number"],然后用china"beijing"["number"]的方法倒可行,但實(shí)際情況是層級(jí)不是固定的,需要增加多個(gè)判斷,所以暫不考慮。

回答
編輯回答
陌上花

寫(xiě)一個(gè)函數(shù) 親測(cè)有效

 var a = '123'
 function evil(fn) {
     var Fn = Function; 
     return new Fn('return ' + fn)();
 }
 console.log(evil(a))  //123  number
2018年8月9日 02:05
編輯回答
墨小羽

你可以通過(guò)var obj = {};obj[key+'xxxx'] = 'vvvvvvvvvvvv';來(lái)調(diào)用探讀

2018年7月18日 10:47
編輯回答
朕略傻

實(shí)際上就是一個(gè)遞增查詢(xún),reduce 方法可以記錄上一次結(jié)果繼續(xù)操作;一般來(lái)說(shuō)不到萬(wàn)不得已不用 eval(),萬(wàn)不得已的情況很少的。。。

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
2017年4月3日 04:07
編輯回答
孤毒
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
2017年10月28日 11:12
編輯回答
舊城人
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
2017年2月25日 06:44