1

这是我的 json 文件:

{
  "categories": {

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

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

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

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

这意味着我需要添加subcategory[0]无限次才能获取每个标题属性 - 创建许多不同的函数来处理每种不同的情况 - 这是我的问题。

4

2 回答 2

2

使用递归函数。就像是:

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;
}

另请注意,这两个函数都假设您没有任何循环(其中子类别实际上指向父级),这将导致这两个函数陷入无限循环(尽管递归函数最终会抛出 a Stack Overflow) .

于 2013-05-16T13:20:21.247 回答
2

只需迭代它们:

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;
}
于 2013-05-16T13:26:02.477 回答