我有一个要解析的JSON。我在这里尝试使用递归方法。当前的JSON具有类似于底部的结构
Item 01
SubItem 01
InnerSubItem 01
Item 02
SubItem 01
InnerSubItem 01
使用我创建的函数,我只能解析第一组(项目01下的内容)。当条件为假时,代码不会返回循环
使用的代码
$.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
之前,您应该检查它的存在。
EG
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>
在旁注中,您似乎没有使用反转数组,并且每次调用data
时都不必要地传递repeat
。您可以编写类似这样的内容(如果需要,可以反转数组):
$.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>