Javascript json文件中的无限嵌套元素-如何获取特定元素?
这是我的json文件:Javascript json文件中的无限嵌套元素-如何获取特定元素?,javascript,Javascript,这是我的json文件: { "categories": { "category": [ { "id": "1", "title": "Android", "subcategory": [ { "id": "1", "title": "JavaScript", "question": [ 我的问题是:如果子类别元素可以出现无限次 由于嵌套本身
{
"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想要迭代每个子类别时,递归可能是一种方法