json文件中的无限嵌套元素 - 如何获取特定元素?

问题描述:

这是我的JSON文件:json文件中的无限嵌套元素 - 如何获取特定元素?

{ 
    "categories": { 

    "category": [ 
     { 
     "id": "1", 
     "title": "Android", 
    "subcategory": [ 

     { 
      "id": "1", 
      "title": "JavaScript", 
      "question": [ 

我的问题是:如果子类元素可以出现无限次数 嵌套本身我怎样才能显示在我的JSON文件中的每个子类中的所有元素在javascript的帮助下,我如何在嵌套中获得北斗? 如果我写我的代码:

data.categories.category[i].subcategory[0].subcategory[0].subcategory[0].title   

这意味着,我需要补充的时候subcategory[0]无限多去各个 title属性 - 创造了很多不同的函数来处理每一个不同的情况 - 这是我的问题。

+4

你说的无限是什么意思?未指定的次数? –

+5

使用[递归](http://en.wikipedia.org/wiki/Recursion_(computer_science)#Recursive_procedures) – Quentin

+0

@ Quentin的评论后续操作:use [recursion](http://stackoverflow.com/questions/16588418/infinite -json-file-how-to-get-specific-element#comment23840284_16588418) – Doorknob

只是重复他们:

function getAllTitles(node) { 
    var cats = data.categories.category, 
     titles = []; 
    for (var i=0; i<cats.length; i++) { 
     var cat = cats[i]; 
     while (cat.subcategory && cat.subcategory[0]) 
      cat = cat.subcategory[0]; // travel deeper 
     // now cat is a subcategory that has no subcategories any more 
     titles.push(cat.title); 
    } 
    return titles; 
} 

使用递归函数。例如:

function getLeafCategory(node) { 
    if (node.subcategory && node.subcategory[0]) { 
     return getLeafCategory(node.subcategory[0]); 
    } 
    return node; 
} 

很明显,如果您的JSON真的无限大,那么这将不起作用!但在这种情况下,您将无法首先加载它!

你会调用它是这样的:

var myTitle = getLeafCategory(data.categories.category[i]).title; 

什么功能需要做的是它会检查你的过去,看看它是否有一个子类别,如果该子类别有一个零的条目。如果是这样,它会再次将该新节点传递给该函数。如果不是,那么你已经达到了链条的末端,并返回结果。

有关递归的一些注意事项:如果您的链条很长,最终可能会得到一个Stack Overflow。应该可以将递归函数重写为while循环,但代码是(恕我直言)不那么优雅。

function getLeafCategoryWithoutRecursion(node) { 
    while(node.subcategory && node.subcategory[0]) { 
     node = node.subcategory[0] 
    } 
    return node; 
} 

还要注意这两个功能是假设你没有(其中一个子类别实际指向回父母),这将导致这两个功能在一个无限循环挂任何环路(虽然递归的最终会抛出Stack Overflow)。

+0

在这种情况下迭代看起来更简单,顺便说一句:-) – Bergi

+0

@Bergi:说实话,在试图用'虽然'循环,我想我同意。 –

+1

当OP想要遍历每个'子类别'数组时,递归可能会走的路:-) – Bergi