【问题标题】:How to get nth level of parsed json?如何获得第n级解析的json?
【发布时间】:2018-11-22 14:33:31
【问题描述】:

我有一个包含三个级别的 JSON,它存储为数组,我需要获得第二级(计数从 0 开始),每个级别以下有 10 多个元素。如何在 JavaScript 上实现它。需要你的帮助。所有回复都会有所帮助。

ps。一些 1 级和 2 级元素可以为空

[
  {
    "name": "0th level first", //0th level
    "options": [
      {
        "name": "1st level Cafe", // 1st level
        "options": [
          {
            "name": "2nd level Staff", //2nd level
            "options": [
              {
                "name": "Gary", //3rd level
                "age": 18
              },
              {
                "name": "James", //3rd level
                "age": 25
              }
            ]
          }
        ]
      }
    ]
  }
]

【问题讨论】:

  • 您提供的json无效
  • @KamilKiełczewski 有什么问题?
  • 提供输出 json(你不想得到的结果)的样子
  • 我只是想出了一个解决方案,我不会认为在可读性和支持方面是最好的(它是实验性的)但我只是想试试flatMap function ,例如,它不是 Node.JS 的一部分,因此请注意它对跨浏览器的支持:arr.flatMap(firstLevel => firstLevel.options.flatMap(secondLevel => secondLevel.options.flatMap(finalLevel => finalLevel.options)));

标签: javascript json parsing


【解决方案1】:

大概是这个吧? :)

  data.forEach((value, index) => {
    for(stage0 in value){
      if(typeof value[stage0] === 'object'){
        value[stage0].forEach((val, index) => {
          for(stage1 in val){
            if(typeof val[stage1] === 'object'){
              val[stage1].forEach((val2, index) => {
                for(stage2 in val2){
                  console.log(val2[stage2]);
                }
              })
            }
          }
        })
      }
    }
  })

【讨论】:

    【解决方案2】:

    您可以使用array.forEach,它只会遍历每个级别。

    在第一个循环中有一个属性调用选项,它是一个数组,您需要在 0 级别循环选项数组,在第二个循环中再次出现一个选项数组,您需要再次循环选项数组,即1级。 然后你达到第三级,即你的输出。

    第三级是指从零开始的第二级。

    我希望这能解决问题。

    var data = [
      {
        "name": "0th level first", //0th level
        "options": [
          {
            "name": "1st level Cafe", // 1st level
            "options": [
              {
                "name": "2nd level Staff", //2nd level
                "options": [
                  {
                    "name": "Gary", //3rd level
                    "age": 18
                  },
                  {
                    "name": "James", //3rd level
                    "age": 25
                  }
                ]
              }
            ]
          }
        ]
      }
    ]
    
    data.forEach(fl => {
     fl.options.forEach(sl => {
      sl.options.forEach(tl => {
        console.log("second level starting from 0",tl)
      })
     })
    })

    【讨论】:

      【解决方案3】:

      假设data包含你的json,我们有2个在线人:

      let out = data[0].options[0].options[0];
      
      let outArr = data.flatMap(x=>x.options.flatMap(y=>y.options));
      

      结果

      // out = {"name":"2nd level Staff","options":[{"name":"Gary","age":18},{"name":"James","age":25}]}
      
      // outArr = [{"name":"2nd level Staff","options":[{"name":"Gary","age":18},{"name":"James","age":25}]}]
      

      第一个 (out) 包含一个第二个元素。我们在这里使用树索引(三个零)首先data[0] 返回数组数据中的第一个元素,然后options[0] 返回选项数组中的第一个元素。

      第二个解决方案 (outArr) 包含所有第二个元素的数组。我们这里使用JS flatMap

      写第二个解决方案启发了我abdullahkady在问题下方评论。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-12
        • 2016-11-24
        • 1970-01-01
        • 2015-03-05
        • 2013-03-23
        • 2023-04-07
        • 2021-02-18
        • 2016-08-05
        相关资源
        最近更新 更多