javascript - JSON 文件递归迭代返回 'undefined' 和找到的值

标签 javascript json undefined

我正在尝试遍历 json 文件以从模板构建文件夹和文件结构。但是,当我指定一个特定的键来记录时,它会同时记录键和我想要的值。有什么办法可以解决这个问题吗?它为什么要这样做?

function scan(obj) {
  if (obj instanceof Object) {
    for (var k in obj) {
      if (obj.hasOwnProperty(k)) {
        scan(obj[k]);
        var val = obj[k];
        console.log(val.dir + '/' + val.file+ '.'+val.ext + '\n');
      }
    }
  }
}
json = [
    {
      "dir": ".github",
      "nodes": [
        {
          "file": "ISSUE_TEMPLATE",
          "ext": "md",
          "data": true
        }
      ]
    },
    {
      "dir": ".vscode",
      "nodes": [
        {
          "file": "extensions",
          "ext": "json"
        },
        {
          "file": "settings",
          "ext": "json"
        }
      ]
    },
    {
      "dir": "app",
      "nodes": [
        {
          "dir": "src",
          "nodes": [
            {
              "dir": "crash",
              "nodes": [
                {
                  "dir": "styles",
                  "nodes": [
                    {
                      "file": "crash",
                      "ext": "scss"
                    }
                  ]
                },
                {
                  "file": "index",
                  "ext": "tsx"
                }
              ]
            },
            {
              "dir": "lib"
            },
            {
              "dir": "main-process",
              "nodes": [
                {
                  "dir": "menu",
                  "nodes": [
                    {
                      "file": "index",
                      "ext": "ts"
                    }
                  ]
                },
                {
                  "file": "main",
                  "ext": "ts"
                }
              ]
            },
            {
              "dir": "models"
            },
            {
              "dir": "shared-process",
              "nodes": [
                {
                  "file": "index",
                  "ext": "ts"
                }
              ]
            },
            {
              "dir": "ui",
              "nodes": [
                {
                  "file": "index",
                  "ext": "tsx"
                }
              ]
            }
          ]
        },
        {
          "dir": "static",
          "nodes": [
            {
              "dir": "common"
            },
            {
              "dir": "logos"
            },
            {
              "file": "error",
              "ext": "html",
              "data": true
            },
            {
              "file": "index",
              "ext": "html",
              "data": true
            }
          ]
        },
        {
          "dir": "styles",
          "nodes": [
            {
              "dir": "mixins"
            },
            {
              "dir": "ui",
              "nodes": [
                {
                  "file": "_app-menu-bar",
                  "ext": "scss"
                },
                {
                  "file": "_focus",
                  "ext": "scss"
                },
                {
                  "file": "_title-bar",
                  "ext": "scss"
                }
              ]
            },
            {
              "file": "_globals",
              "ext": "scss"
            },
            {
              "file": "_mixins",
              "ext": "scss"
            },
            {
              "file": "_type",
              "ext": "scss"
            },
            {
              "file": "_ui",
              "ext": "scss"
            },
            {
              "file": "_variables",
              "ext": "scss"
            },
            {
              "file": "_vendor",
              "ext": "scss"
            },
            {
              "file": "appname",
              "ext": "scss"
            }
          ]
        },
        {
          "dir": "test"
        },
        {
          "file": "package",
          "ext": "json",
          "data": true
        },
        {
          "file": "webpack.common",
          "ext": "js"
        },
        {
          "file": "webpack.development",
          "ext": "js"
        },
        {
          "file": "webpack.production",
          "ext": "js"
        }
      ]
    },
    {
      "dir": "docs",
      "nodes": [
        {
          "dir": "contributing",
          "nodes": [
            {
              "file": "setup",
              "ext": "md"
            },
            {
              "file": "styleguide",
              "ext": "md"
            },
            {
              "file": "tooling",
              "ext": "md"
            },
            {
              "file": "troubleshooting",
              "ext": "md"
            }
          ]
        },
        {
          "dir": "process",
          "nodes": [
            {
              "file": "issue-triage",
              "ext": "md"
            },
            {
              "file": "releasing-updates",
              "ext": "md"
            },
            {
              "file": "reviews",
              "ext": "md"
            },
            {
              "file": "roadmap",
              "ext": "md"
            }
          ]
        },
        {
          "dir": "technical"
        },
        {
          "file": "installation",
          "ext": "md"
        },
        {
          "file": "README",
          "ext": "md"
        }
      ]
    },
    {
      "dir": "script",
      "nodes": [
        {
          "file": "build"
        },
        {
          "file": "debug"
        },
        {
          "file": "dist-info",
          "ext": "js"
        },
        {
          "file": "package"
        },
        {
          "file": "publish"
        },
        {
          "file": "run",
          "ext": "js"
        },
        {
          "file": "start"
        }
      ]
    },
    {
      "file": ".gitmodules"
    },
    {
      "file": ".travis",
      "ext": "yml"
    },
    {
      "file": "appveyor",
      "ext": "yml"
    } 
  ]

scan(json)

最佳答案

您需要在递归函数中指定父目录,否则父目录将始终为空。此外,您应该只将 nodes 数组传递给下一个调用而不是整个子文档:

function scan(parent, obj) {
  for (var k in obj) {
    if (obj[k]) {
      if (obj[k].nodes && obj[k].dir) {
        scan(parent + '/' + obj[k].dir, obj[k].nodes);
      }
      if (obj[k].file && obj[k].ext) {
        console.log(parent + '/' +
          obj[k].file + '.' +
          obj[k].ext + '\n');
      }
    }
  }
}
json = [{
    "dir": ".github",
    "nodes": [{
      "file": "ISSUE_TEMPLATE",
      "ext": "md",
      "data": true
    }]
  },
  {
    "dir": ".vscode",
    "nodes": [{
        "file": "extensions",
        "ext": "json"
      },
      {
        "file": "settings",
        "ext": "json"
      }
    ]
  },
  {
    "dir": "app",
    "nodes": [{
        "dir": "src",
        "nodes": [{
            "dir": "crash",
            "nodes": [{
                "dir": "styles",
                "nodes": [{
                  "file": "crash",
                  "ext": "scss"
                }]
              },
              {
                "file": "index",
                "ext": "tsx"
              }
            ]
          },
          {
            "dir": "lib"
          },
          {
            "dir": "main-process",
            "nodes": [{
                "dir": "menu",
                "nodes": [{
                  "file": "index",
                  "ext": "ts"
                }]
              },
              {
                "file": "main",
                "ext": "ts"
              }
            ]
          },
          {
            "dir": "models"
          },
          {
            "dir": "shared-process",
            "nodes": [{
              "file": "index",
              "ext": "ts"
            }]
          },
          {
            "dir": "ui",
            "nodes": [{
              "file": "index",
              "ext": "tsx"
            }]
          }
        ]
      },
      {
        "dir": "static",
        "nodes": [{
            "dir": "common"
          },
          {
            "dir": "logos"
          },
          {
            "file": "error",
            "ext": "html",
            "data": true
          },
          {
            "file": "index",
            "ext": "html",
            "data": true
          }
        ]
      },
      {
        "dir": "styles",
        "nodes": [{
            "dir": "mixins"
          },
          {
            "dir": "ui",
            "nodes": [{
                "file": "_app-menu-bar",
                "ext": "scss"
              },
              {
                "file": "_focus",
                "ext": "scss"
              },
              {
                "file": "_title-bar",
                "ext": "scss"
              }
            ]
          },
          {
            "file": "_globals",
            "ext": "scss"
          },
          {
            "file": "_mixins",
            "ext": "scss"
          },
          {
            "file": "_type",
            "ext": "scss"
          },
          {
            "file": "_ui",
            "ext": "scss"
          },
          {
            "file": "_variables",
            "ext": "scss"
          },
          {
            "file": "_vendor",
            "ext": "scss"
          },
          {
            "file": "appname",
            "ext": "scss"
          }
        ]
      },
      {
        "dir": "test"
      },
      {
        "file": "package",
        "ext": "json",
        "data": true
      },
      {
        "file": "webpack.common",
        "ext": "js"
      },
      {
        "file": "webpack.development",
        "ext": "js"
      },
      {
        "file": "webpack.production",
        "ext": "js"
      }
    ]
  },
  {
    "dir": "docs",
    "nodes": [{
        "dir": "contributing",
        "nodes": [{
            "file": "setup",
            "ext": "md"
          },
          {
            "file": "styleguide",
            "ext": "md"
          },
          {
            "file": "tooling",
            "ext": "md"
          },
          {
            "file": "troubleshooting",
            "ext": "md"
          }
        ]
      },
      {
        "dir": "process",
        "nodes": [{
            "file": "issue-triage",
            "ext": "md"
          },
          {
            "file": "releasing-updates",
            "ext": "md"
          },
          {
            "file": "reviews",
            "ext": "md"
          },
          {
            "file": "roadmap",
            "ext": "md"
          }
        ]
      },
      {
        "dir": "technical"
      },
      {
        "file": "installation",
        "ext": "md"
      },
      {
        "file": "README",
        "ext": "md"
      }
    ]
  },
  {
    "dir": "script",
    "nodes": [{
        "file": "build"
      },
      {
        "file": "debug"
      },
      {
        "file": "dist-info",
        "ext": "js"
      },
      {
        "file": "package"
      },
      {
        "file": "publish"
      },
      {
        "file": "run",
        "ext": "js"
      },
      {
        "file": "start"
      }
    ]
  },
  {
    "file": ".gitmodules"
  },
  {
    "file": ".travis",
    "ext": "yml"
  },
  {
    "file": "appveyor",
    "ext": "yml"
  }
]

scan('', json)

关于javascript - JSON 文件递归迭代返回 'undefined' 和找到的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44866997/

相关文章:

javascript - CodeMirror 和括号,带有 CSS 快速编辑的自定义模式

javascript - 如何使用 AngularJS RouteProvider 重定向到外部 URL

arrays - jq:只选择一个包含元素 A 但不包含元素 B 的数组

javascript - 递归转换json对象

javascript - next.js 环境变量未定义(Next.js 10.0.5)

javascript - 使用 Handsontable 在同一列中对纯文本和 html 进行排序问题

javascript - PHP:在网络浏览器中输出 system/Shell_exec 命令输出

json - 无效的 JSON 架构错误

jquery - jqgrid中的"Undefined"消息,"b.jgrid.formatter is undefined"

android - 无法编译 Vitamio demo