Javascript json递归+;选择元素
如何使用json和mootools库填充select元素 我的JSON数据如下:Javascript json递归+;选择元素,javascript,recursion,mootools,Javascript,Recursion,Mootools,如何使用json和mootools库填充select元素 我的JSON数据如下: var data = {"tree": [ {"id":1,"parent":0,"name":"Category A","subcategories":[]}, {"id":2,"parent":0,"name":"Category B","subc
var data = {"tree":
[
{"id":1,"parent":0,"name":"Category A","subcategories":[]},
{"id":2,"parent":0,"name":"Category B","subcategories":
[
{"id":6,"parent":2,"name":"Subcategory F","subcategories":[]},
{"id":7,"parent":2,"name":"Subcategory G","subcategories":[]}
]
},
{"id":3,"parent":0,"name":"Category C","subcategories":
[
{"id":8,"parent":3,"name":"Subcategory H","subcategories":[]}
]
},
{"id":4,"parent":0,"name":"Category D","subcategories":
[
{"id":9,"parent":4,"name":"Subcategory I","subcategories":
[
{"id":10,"parent":9,"name":"Subcategory J","subcategories":[]}
]
}
]
},{"id":5,"parent":0,"name":"Category E","subcategories":[]}
]
};
如何获取此输出标记:
<select>
<option value="1">Category A</option>
<option value="2">Category B</option>
<option value="6">Category B->Subcategory F</option>
<option value="7">Category B->Subcategory G</option>
<option value="3">Category C</option>
<option value="8">Category C->Subcategory H</option>
<option value="4">Category D</option>
<option value="9">Category D->Subcategory I</option>
<option value="10">Category D->Subcategory I->Subcategory J</option>
<option value="5">Category E</option>
</select>
A类
B类
类别B->子类别F
类别B->子类别G
C类
C类->H子类
D类
D类->子类I
D类->子类I->子类J
E类
使用递归
代码:
var数据={“树”:
[
{“id”:1,“父级”:0,“名称”:“类别A”,“子类别”:[]},
{“id”:2,“父级”:0,“名称”:“类别B”,“子类别”:
[
{“id”:6,“父”:2,“名称”:“子类别F”,“子类别”:[]},
{“id”:7,“parent”:2,“name”:“Subcategory G”,“subcategories”:[]}
]
},
{“id”:3,“父级”:0,“名称”:“C类”,“子类”:
[
{“id”:8,“父”:3,“名称”:“子类别H”,“子类别”:[]}
]
},
{“id”:4,“父级”:0,“名称”:“类别D”,“子类别”:
[
{“id”:9,“父”:4,“名称”:“子类别I”,“子类别”:
[
{“id”:10,“parent”:9,“name”:“Subcategory J”,“subcategories”:[]}
]
}
]
},{“id”:5,“父级”:0,“名称”:“E类”,“子类”:[]}
]
};
//创建select元素
var select=新元素(“select”);
//递归函数继续执行所有元素->子元素等。。。
函数递归数据(arr,父项名称前缀){
如果(!parent_name_prefix){parent_name_prefix=''';}
每个(功能(项目)对应{
var name=item.name;
变量字母=名称。拆分(“”)[1];
var值=getABNumber(字母);
var text=父项名称前缀+名称;
addSelectOption(文本、值);
var arr_sub=项目子类别;
递归数据(arr_sub,text+'->');
});
}
//添加要选择的选项
函数addSelectOption(文本、值){
select.options[select.options.length]=新选项(文本、值);
}
//根据字母得到numner的函数
函数getABNumber(val){
var base='ABCDEFGHIjklmnopqrstuvxyz',i,j,结果=0;
对于(i=0,j=val.length-1;i
为什么我否决了这个问题:更简单的解决方案没有getABNumber函数,只使用了我没有看到的'id'属性:)
var data = {"tree":
[
{"id":1,"parent":0,"name":"Category A","subcategories":[]},
{"id":2,"parent":0,"name":"Category B","subcategories":
[
{"id":6,"parent":2,"name":"Subcategory F","subcategories":[]},
{"id":7,"parent":2,"name":"Subcategory G","subcategories":[]}
]
},
{"id":3,"parent":0,"name":"Category C","subcategories":
[
{"id":8,"parent":3,"name":"Subcategory H","subcategories":[]}
]
},
{"id":4,"parent":0,"name":"Category D","subcategories":
[
{"id":9,"parent":4,"name":"Subcategory I","subcategories":
[
{"id":10,"parent":9,"name":"Subcategory J","subcategories":[]}
]
}
]
},{"id":5,"parent":0,"name":"Category E","subcategories":[]}
]
};
//create the select element
var select = new Element('select');
//recurse function going on all the elements->sub-elements etc...
function recurseData(arr,parent_name_prefix){
if(!parent_name_prefix){parent_name_prefix = '';}
arr.each(function(item){
var name = item.name;
var letter = name.split(' ')[1];
var value = getABNumber(letter);
var text = parent_name_prefix + name;
addSelectOption(text,value);
var arr_sub = item.subcategories;
recurseData(arr_sub,text + ' -> ');
});
}
//add option to select
function addSelectOption(text,value){
select.options[select.options.length] = new Option(text,value);
}
//function that get numner according to letter
function getABNumber (val) {
var base = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', i, j, result = 0;
for (i = 0, j = val.length - 1; i < val.length; i += 1, j -= 1) {
result += Math.pow(base.length, j) * (base.indexOf(val[i]) + 1);
}
return result;
};
//trigger all using the main arr
recurseData(data.tree);
//inject select to body
select.inject(document.body);