我目前正在处理一个问题,写一个recrusive函数来订购一些json数据.我有几个嵌套的对象数组,我需要订购单个幻灯片.结构类似于以下内容:
[ { "title": "a","children": [ { "title": "a-a","children": [ { "title": "a-a-a" },{ "title": "a-a-b" } ] },{ "title": "a-b","children": [ { "title": "a-b-a" },{ "title": "a-b-b" } ] } ] },{ "title": "b","children": [ { "title": "b-a","children": [ { "title": "b-a-a" },{ "title": "b-a-b" } ] },{ "title": "b-b","children": [ { "title": "b-b-a" },{ "title": "b-b-b" } ] } ] } ]
我写了一个递归函数:
var catalog = { init: function() { var _this = this; $.getJSON("catalog.json",function(data) { _this.slides = []; _this.parseCategories(data.catalog.category,-1,0); }); },parseCategories: function(array,depth,prevParent) { ++depth; if (!this.slides[depth]) this.slides[depth] = []; if (!this.slides[depth][prevParent]) this.slides[depth][prevParent] = []; this.slides[depth][prevParent].push(array); for (var i = 0; i < array.length; i++) { if (array[i].category) { this.parseCategories(array[i].category,i); } } } } catalog.init();
这输出:
但是,而不是在格式下检索我的第三张幻灯片的数据:
A-A-A
A-B-A
A-C-一个
我想得到
一个-α-[A,B,C]
我想知道这是否可能,因为我不擅长处理递归过程.我希望我很清楚,谢谢你阅读本文.
我基本上需要保留原始数据结构,但删除每次迭代的第一个深度级别(滑块中的滑动表示我的数据结构中的深度增加).
解决方法@H_301_29@
我最近编写了一个算法来递归处理这样的数据.这是一个
jsfiddle和主要功能
console.log('starting');
// data in tree format.
var output = {};
// data in slide format ["a-a-a","a-a-b","b-b-a","b-b-b"]
var outputStrs = [];
parseData(data,output);
console.log(output);
console.log(outputStrs);
function parseData(data,store) {
// go through each element
for (var i = 0; i < data.length; i++) {
var element = data[i];
// used to keep track of where we are in the tree.
var splitElement = element.title.split('-');
var titleStart = splitElement[0];
// console.log(element);
if (_.has(element,'children') && _.isArray(element.children)) {
// if there is a children,then recursively handle it.
store[titleStart] = {};
parseData(element.children,store[titleStart]);
} else {
// if we are at the end,then add in the data differently.
var titleEnd = splitElement[splitElement.length-1];
store[titleEnd] = titleEnd;
// create the slides
var slide = [];
for (var j = 0; j < splitElement.length; j++) {
if (j !== splitElement.length - 1) {
slide.push(titleStart);
} else {
slide.push(titleEnd);
}
}
slide = slide.join('-');
if (!_.contains(outputStrs,slide)) outputStrs.push(slide);
}
}
}
使用此数据,输出应该类似
a
a
a
b
b
b
a
b
而outputStrs将类似于a-a- [a,b,c]
希望这可以帮助!!!
console.log('starting'); // data in tree format. var output = {}; // data in slide format ["a-a-a","a-a-b","b-b-a","b-b-b"] var outputStrs = []; parseData(data,output); console.log(output); console.log(outputStrs); function parseData(data,store) { // go through each element for (var i = 0; i < data.length; i++) { var element = data[i]; // used to keep track of where we are in the tree. var splitElement = element.title.split('-'); var titleStart = splitElement[0]; // console.log(element); if (_.has(element,'children') && _.isArray(element.children)) { // if there is a children,then recursively handle it. store[titleStart] = {}; parseData(element.children,store[titleStart]); } else { // if we are at the end,then add in the data differently. var titleEnd = splitElement[splitElement.length-1]; store[titleEnd] = titleEnd; // create the slides var slide = []; for (var j = 0; j < splitElement.length; j++) { if (j !== splitElement.length - 1) { slide.push(titleStart); } else { slide.push(titleEnd); } } slide = slide.join('-'); if (!_.contains(outputStrs,slide)) outputStrs.push(slide); } } }
使用此数据,输出应该类似
a a a b b b a b
而outputStrs将类似于a-a- [a,b,c]
希望这可以帮助!!!