动态属性访问器[重复]

问题描述 投票:0回答:1

给出点符号的属性访问器,例如。 google.maps.places,我需要评估声明以获得属性值。

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

当然,它有效,但我从来没有在生产中使用eval而且永远不会想要,所以只是想知道是否有更好的方法?另外因为这是一个快速的例子,但函数可以接受任何级别的访问器,只需googlegoogle.maps甚至google.maps.places.autocomplete

javascript object accessor
1个回答
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'))
© www.soinside.com 2019 - 2024. All rights reserved.