我目前正在使用Angular 2应用程序中的配置服务,我目前关注的是在我的代码中使用eval来检索配置中的值。
以下是我的配置文件示例:
{
"application": {
"environment": "dev",
"displayMenu": false
},
"error": {
"title": "Title Error",
"message": "Error message"
}
}
我正在使用简单的HTTP请求检索此JSON,但现在我想访问一个元素,其get方法定义如下:
get(key: any) {
return (eval("this._config." + key));
}
正如您所看到的,我希望避免使用代码中的eval。我被迫使用eval来允许开发人员执行.get('application.environment'),实际上我找不到其他任何一个简单的可能性。
我能看到的另一种方法是将键分开为“。”并在我的JSON中检索正确的元素,就像它是一个简单的数组。但是通过这个解决方案,我只会陷入一个深度。
答案 0 :(得分:1)
您可以使用要查看的对象键数组,然后减少返回对象键的数组。如果您希望将字符串作为对象访问器,则可以轻松使用string.split('.')
来创建可以减少的数组。
const data = {
"application": {
"environment": "dev",
"displayMenu": false
},
"error": {
"title": "Title Error",
"message": "Error message",
"deeper": {
"evenDeeper": "You can get to any level"
}
}
}
const path = (keys, obj) => {
return keys.reduce((obj, key) => {
return typeof obj !== 'undefined'
? obj[key]
: void 0
}, obj)
}
console.log(
path(['application', 'environment'], data)
)
console.log(
path('error.message'.split('.'), data) // move the split inside the path function
)
console.log(
path(['error', 'deeper', 'evenDeeper'], data)
)
console.log(
path(['error', 'fail', 'damn'], data) // fail safe
)

<script src="http://codepen.io/synthet1c/pen/WrQapG.js"></script>
&#13;