动态 属性 存取器
Dynamic property accessor
给定一个 属性 点符号访问器,例如。 google.maps.places
,我需要评估语句以获得 属性 值。
var str = 'google.maps.places';
var statement = 'window["' + str.split('.').join('"]["') + '"]';
eval(statement);
当然可以,但我从来没有在生产中使用过 eval
,也永远不想用,所以只是想知道是否有更好的方法?也因为这是一个简单的例子,但函数可以接受任何级别的访问器,只是 google
或 google.maps
甚至 google.maps.places.autocomplete
。
您可以使用 split()
和 reduce()
let obj = {
google:{
maps:{
places:["Place 1","place 2"]
}
}
}
function findItem(obj,path){
path = path.split('.');
return path.reduce((ac,a) => (ac.hasOwnProperty(a) ? ac[a] : {}),obj);
}
console.log(findItem(obj,'google.maps.places'))
给定一个 属性 点符号访问器,例如。 google.maps.places
,我需要评估语句以获得 属性 值。
var str = 'google.maps.places';
var statement = 'window["' + str.split('.').join('"]["') + '"]';
eval(statement);
当然可以,但我从来没有在生产中使用过 eval
,也永远不想用,所以只是想知道是否有更好的方法?也因为这是一个简单的例子,但函数可以接受任何级别的访问器,只是 google
或 google.maps
甚至 google.maps.places.autocomplete
。
您可以使用 split()
和 reduce()
let obj = {
google:{
maps:{
places:["Place 1","place 2"]
}
}
}
function findItem(obj,path){
path = path.split('.');
return path.reduce((ac,a) => (ac.hasOwnProperty(a) ? ac[a] : {}),obj);
}
console.log(findItem(obj,'google.maps.places'))