基于变量访问Json中的二级子级

时间:2016-12-01 13:36:04

标签: javascript json typescript

我目前正在使用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中检索正确的元素,就像它是一个简单的数组。但是通过这个解决方案,我只会陷入一个深度。

1 个答案:

答案 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;
&#13;
&#13;