【问题标题】:How to iterate JSON with multiple levels?如何迭代多个级别的 JSON?
【发布时间】:2017-01-19 17:51:06
【问题描述】:

欢迎,我的 JSON 文件有问题。我想遍历它并将每个状态放入数组中,但我被卡住了。我加载这个文件并解析它。然后我尝试使用 forEach 但它没有用。感谢您的帮助!

[{
  "offers": [{
    "advertiser_api_id": 12,
    "status": 1
  }, {
    "advertiser_api_id": 13,
    "status": 0
  }]
}]

【问题讨论】:

  • 是否要将所有状态值提取到一个新数组中?对于上面的例子,你会得到[1, 0]?
  • 用美化器格式化 JSON 往往会使它的结构更清晰;这会有所帮助
  • 你需要迭代多少层?

标签: javascript json node.js


【解决方案1】:

我假设这将在 javascript 中。您可以尝试以下方法:

for (x in json[0].offers) {
    console.log(json[0].offers[x].status);
}

【讨论】:

  • offers json 不是在一个数组中,所以他必须为json[0].offers 中的x 做?
【解决方案2】:

你在 Array 中有一个对象数组。

首先,您需要使用JSON.parse(data);将数据从JSON解析为对象,然后访问对象offers。使用parsedData[0].offers 对象,然后遍历数组以获取状态。

var data = `[{
  "offers": [{
    "advertiser_api_id": 12,
    "status": 1
  }, {
    "advertiser_api_id": 13,
    "status": 0
  }]
}]`;

var parsedData = JSON.parse(data);
var result = [];
parsedData[0].offers.forEach((currentValue) => result.push(currentValue["status"]));
console.log(result)

【讨论】:

  • 实际上是一个(对象的)数组在一个对象内在一个数组内
【解决方案3】:

你可以使用map函数:

var data = [{
  "offers": [{
    "advertiser_api_id": 12,
    "status": 1
  }, {
    "advertiser_api_id": 13,
    "status": 0
  }]
}]

var stats = data[0].offers.map(function(item) {
  return item.status;
})

console.log(stats);

【讨论】:

    【解决方案4】:

    这会循环遍历对象并将数据打印到控制台 - 您可能没有到达要循环的正确数组。

    var data = [{
      "offers": [{
        "advertiser_api_id": 12,
        "status": 1
          }, {
        "advertiser_api_id": 13,
        "status": 0
      }]
    }];
    
    data[0].offers.forEach(function(element) {
      console.log(element.status);
    });
    

    【讨论】:

    • 你是对的,我没有深入到那个数组中。谢谢,您的代码有效:)
    【解决方案5】:

    这会起作用

    statuses = []
    JSON.parse(data)[0].offers.forEach(x => statuses.push(x.status))
    

    【讨论】:

      【解决方案6】:

      递归方法

              var item = [{
            "offers": [{
              "advertiser_api_id": 12,
              "status": 1
            }, {
              "advertiser_api_id": 13,
              "status": 0
            }]
          }];
      
          var statusArray = [];
          function getStatusForALlLevels(item){
           if(item.offers instanceof Array){
           for(var i=0;i<item.offers.length;i++){
            getStatusForALlLevels(item.offers[i]);
            }
           }else{
             statusArray.push(item.status);
           }
          }
          getStatusForALlLevels(item[0]);
          console.log(statusArray);
      

      【讨论】:

        【解决方案7】:

        您可以使用迭代和递归方法从多个嵌套对象中获取status

        var data = [{ offers: [{ advertiser_api_id: 12, status: 1 }, { advertiser_api_ii: 13, status: 0 }] }],
            status = data.reduce(function iter(r, o) {
                if ('status' in o) {
                    r.push(o.status);
                }
                Object.keys(o).forEach(function (k) {
                    if (Array.isArray(o[k])) {
                        r = o[k].reduce(iter, r);
                    }
                });
                return r;
            }, []);
        
        console.log(status);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-09-01
          • 2017-11-22
          • 1970-01-01
          • 1970-01-01
          • 2017-09-21
          • 1970-01-01
          • 2016-03-12
          • 2020-11-20
          相关资源
          最近更新 更多