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

Javascript json文件中的无限嵌套元素-如何获取特定元素?,javascript,Javascript,这是我的json文件: { "categories": { "category": [ { "id": "1", "title": "Android", "subcategory": [ { "id": "1", "title": "JavaScript", "question": [ 我的问题是:如果子类别元素可以出现无限次 由于嵌套本身

这是我的json文件:

{
  "categories": {

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

        {
            "id": "1",
            "title": "JavaScript",
            "question": [
我的问题是:如果子类别元素可以出现无限次 由于嵌套本身,如何在javascript的帮助下显示json文件中每个子类别的所有元素?如何在嵌套中获得北斗七星? 如果我正在编写代码:

data.categories.category[i].subcategory[0].subcategory[0].subcategory[0].title          
这意味着我需要添加
子类别[0]
无限次才能访问每个子类别
title属性-创建许多不同的函数来处理不同的情况-这是我的问题。

使用递归函数。比如:

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;
函数将要做的是检查您传入的内容,并查看它是否有子类别,以及该子类别是否有第0个条目。如果是,它会再次将新节点传递给函数。如果没有,那么您已经到达了链的末端,它将返回您的结果

关于递归的几个注意事项:如果你的链很长,你最终可能会得到一个
堆栈溢出。应该可以将递归函数重写为
while
循环,但代码(IMHO)不太优雅

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

还要注意,这两个函数都假设没有任何循环(其中子类别实际上指向父类),这将导致这两个函数挂起在一个无限循环中(尽管递归函数最终会引发堆栈溢出)。

使用递归函数。比如:

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;
函数将要做的是检查您传入的内容,并查看它是否有子类别,以及该子类别是否有第0个条目。如果是,它会再次将新节点传递给函数。如果没有,那么您已经到达了链的末端,它将返回您的结果

关于递归的几个注意事项:如果你的链很长,你最终可能会得到一个
堆栈溢出。应该可以将递归函数重写为
while
循环,但代码(IMHO)不太优雅

function getLeafCategoryWithoutRecursion(node) {
    while(node.subcategory && node.subcategory[0]) {
        node = node.subcategory[0]
    }
    return node;
}
还要注意,这两个函数都假设没有任何循环(其中子类别实际上指向父类),这将导致这两个函数挂起在一个无限循环中(尽管递归函数最终会引发堆栈溢出)。

只需迭代它们:

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;
}
函数getAllTitles(节点){ var cats=data.categories.categority, 头衔=[]; 对于(var i=0;i只需迭代它们:

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;
}
函数getAllTitles(节点){ var cats=data.categories.categority, 头衔=[];
对于(var i=0;i无限是什么意思?未指定次数?使用@Quentin的评论后续:使用你将用你的无限json brek interwebz!但这个问题可能会帮助你:无限是什么意思?未指定次数?使用@Quentin的评论后续:使用你将用你的json brek interwebz无限json!但也许这个问题会帮助你:在这种情况下,迭代看起来简单得多,顺便说一句:-@Bergi:老实说,在尝试用
while
循环重写它之后,我想我同意。当OP想要迭代每个
子类别时,递归可能是最好的方法在这种情况下,迭代看起来要简单得多,顺便说一下:-)@Bergi:老实说,在尝试用
while
循环重写它之后,我想我同意。当OP想要迭代每个
子类别时,递归可能是一种方法