我正在进行API调用,返回大量JSON数据树。它的结构如下:
{
...
children: [ {
... children: [ ... ], ...
}, ... (10 or more objects) ]
...
}
最终(它非常大!)children
数组将包含没有children
数组的对象。我需要遍历整个对象并获取所有具有属性content-kind: "Video"
的元素;如果它具有content-kind
属性,则保证不会有children
数组。
有时会发生什么:
children: [{ content-kind: "Video" }, { children: [ ... ] }, ...]
我想使用content-kind: "Video"
抓取对象,但仍搜索带有children
数组的对象。
我已经尝试了我能想到的while和for循环的所有组合,但我无法解决我的问题。
编辑:最佳尝试:
var e = json.children;
while (e.children) { e = e[0].children; }
if (e.content_kind == "Video") return e;
显然这不会奏效。
答案 0 :(得分:3)
要遍历树并为每个节点调用handle_node()
,递归将是
function traverse(node) {
if(node.children) node.children.forEach(traverse);
handle_node(node);
}
详细了解tree traversal。
答案 1 :(得分:1)
如果您有嵌套元素,并且您不知道树/图形/有多深,则应使用递归。这是一个简单的伪代码,可能对您有所帮助:
function traverseTree(tree) {
var results = [];
for (var i = 0; i < tree.length; i++) {
if (tree[i].hasOwnProperty('content-kind') && tree[i]['content-kind'] === 'Video') {
results.push(tree[i]);
} else if (tree[i].hasOwnProperty('children')) {
results = results.concat(traverseTree(tree[i].children)); // here's the magic
}
}
return results;
}
这是JSFiddle:http://jsfiddle.net/2hannxqr/
答案 2 :(得分:0)
你可以创建一个循环的循环函数,或者你可以自己半假 - 严重解析JSON:
json = '{"children":[{"children":[{"children":[{"content-kind":"video","foo":"bar"},{"content-kind":"video","foo":"baz"}]}]}]}';
objects = json.match(/{"content-kind":"video"[^}]+}/g);
objects
现在将是一个JSON对象数组:
['{"kind":"video","foo":"bar"}', '{"kind":"video","foo":"baz"}']
你可以循环,JSON.parse()
并阅读。
此方法需要非常精确的JSON结构和键顺序和编码等。