【问题标题】:Javascript: How do I access values in nested objects if I don’t know the object’s key?Javascript:如果我不知道对象的键,如何访问嵌套对象中的值?
【发布时间】:2014-06-10 03:52:35
【问题描述】:

如果我有一个从 JSON 解析的 Javascript 对象,它嵌套了三层,而我不知道中间那个的键,我如何访问它及其内容?

我使用的实际数据来自 Github API。对于这个例子,我想要所有要点的文件名。

[
  {
    "url": "https://api.github.com/gists/11164200",
    "forks_url": "https://api.github.com/gists/11164200/forks",
    "commits_url": "https://api.github.com/gists/11164200/commits",
    "id": "11164200",
    "git_pull_url": "https://gist.github.com/11164200.git",
    "git_push_url": "https://gist.github.com/11164200.git",
    "html_url": "https://gist.github.com/11164200",
    "files": {
      "testing.md": {
        "filename": "testing.md",
        "type": "text/plain",
        "language": "Markdown",
        "raw_url": "https://gist.githubusercontent.com/omphalosskeptic/11164200/raw/3582779a4925ea514382cedb7d077d00c231f3eb/testing.md",
        "size": 4254
      }
    }, // [ ... continues]

我的 Javascript 技能还很初级。通常我可以通过足够的研究找到我正在寻找的东西,但这次不行。最初我预计它会类似于:responseObj[0].files[0].filename

如果可能的话,我想保留这个简单的 Javascript。

谢谢!

【问题讨论】:

    标签: javascript json object github github-api


    【解决方案1】:

    根据您发布的示例,files 属性不是数组,因此索引器无法访问。在这种情况下,您将使用 for-in 循环而不是常规的 for 循环。

    for(var p in responseObj[0].files) {                 
      if ( responseObj[0].files.hasOwnProperty (p) ) {   
        p; // p is your unknown property name
        responseObj[0].files[p]; // is the object which you can use to access 
                                 // its own properties (filename, type, etc)           
      }                                                                                                           
    }
    

    hasOwnProperty 检查将跳过像 toString 这样的自动成员,只返回在对象上手动定义的那些。

    【讨论】:

      【解决方案2】:

      如果您想遍历它们,请执行以下操作

      for (var fileID in responseObj[0].files) {
          var file = responseObj[0].files[fileID];
          var filename = file.filename;
      }
      

      【讨论】:

      • 在循环中使用 var 会让人产生一种错误的印象,即 JavaScript 具有块级范围。
      • 确实如此,但如果您还不知道,将它们移到外面并不会真正帮助您理解。如果您确实知道,那么您可以有意识地忽略在函数开头移动 var 声明,因为它读起来更糟。我知道 Crockford 是从哪里来的,但我真的不明白它对那些甚至不了解块或函数范围意味着什么的人有什么帮助。
      • 感谢您的及时答复!不幸的是,我没有足够的代表来支持你的帖子,我只能接受一个......
      猜你喜欢
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 1970-01-01
      • 2018-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多