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

Infinite nested elements in a json file - How to get specific element?

本文关键字:元素 何获得 嵌套 文件 无限 json      更新时间:2023-09-26

这是我的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属性-创建许多不同的函数来处理每个不同的情况-这是我的问题。

迭代它们:

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;

函数将检查传入的内容并查看它是否有子类别以及该子类别是否有第0个条目。如果是,它将新节点再次传递给函数。如果不是,那么你已经到达链的末端,它返回你的结果。

关于递归的几个注意事项:如果你的链真的很长,你可能最终得到一个Stack Overflow。应该可以将递归函数重写为while循环,但代码(IMHO)有点不那么优雅。

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

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