循环遍历包含包含包含数组的对象的数组的JSON对象

时间:2015-07-22 12:17:18

标签: javascript arrays json object

我正在进行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;

显然这不会奏效。

3 个答案:

答案 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结构和键顺序和编码等。