使用递归和循环解析JSON



我有一个可以解析的JSON。我正在尝试在这里使用递归方法。当前的JSON具有类似于底部的结构

Item 01
 SubItem 01
  InnerSubItem 01
Item 02
 SubItem 01
  InnerSubItem 01

使用我创建的函数,我只能解析第一组(项目01下的内容)。当条件为false

时,代码不会返回循环

使用的代码

$.getJSON('https://api.myjson.com/bins/6atbz', function(data) {
  repeat(data, data.layers);
})
function repeat(data, x) {
  var layer = data.layers.reverse()
  for (i = 0; i < x.length; i++) {
    name = x[i].name
    console.log(name)
    if (x[i].layers.length > 0) {
      repeat(data, x[i].layers)
    }
  }
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

当对象没有layers属性时,您的代码会断开。您应该在检查length之前检查其存在。

,例如

if (x[i].layers && x[i].layers.length > 0)

修复代码:

$.getJSON('https://api.myjson.com/bins/6atbz', function(data) {
  repeat(data, data.layers);
})
function repeat(data, x) {
  var layer = data.layers.reverse();
  for (var i = 0; i < x.length; i++) {
    name = x[i].name;
    console.log(name);
    if (x[i].layers && x[i].layers.length > 0) {
      repeat(data, x[i].layers);
    }
  }
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

在旁注上,您似乎不会使用反向数组,并且每次调用repeat时都会不必要地传递data。您可能会写这样的东西(如果需要的话,请反转数组):

$.getJSON('https://api.myjson.com/bins/6atbz', function(data) {
  repeat(data);
})
function repeat(data) {
  if (!data || !data.layers)
    return;
  var x = data.layers;
  for (var i = 0; i < x.length; i++) {
    name = x[i].name;
    console.log(name);
    repeat(x[i]);
  }
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

最新更新