动态属性访问器

时间:2019-03-27 11:08:57

标签: javascript object accessor

以点表示法(例如)给出属性访问器。 google.maps.places,我需要评估该语句以获取属性值。

var str = 'google.maps.places';
var statement = 'window["' + str.split('.').join('"]["') + '"]';
eval(statement);

当然可以,但是我从未在生产中使用eval,也从不愿意这样做,所以只是想知道是否有更好的方法吗?同样因为这是一个简单的示例,但是该函数可以接受任何级别的访问器,仅googlegoogle.maps甚至是google.maps.places.autocomplete

1 个答案:

答案 0 :(得分:2)

您可以使用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'))