我正在使用可以包含子类别对象数组的类别对象数组。棘手的部分是,此嵌套数据的深度是未知的(并且可以更改)。(请参阅底部的示例。)我要做的是将“线索”返回到类别对象,但是我遇到了各种各样的困难。
理想情况下,findCategory('b4')将返回:(['c1', 'd2', 'd3', 'b4']请参阅示例)。
findCategory('b4')
['c1', 'd2', 'd3', 'b4']
我认为我的问题是我无法正确打破由递归引起的嵌套循环。有时,我会在路径中获得更多类别,或者当我认为自己已经突破时,一些更深层的嵌套类别最终会出现在路径中。
一个结果可能看起来像这样。显然,这并没有杀死b4处的循环,而且我不确定为什么会两次发现结果。
b4 FOUND ["c1", "d2", "d3", "b4"] e2 FOUND ["c1", "d2", "d3", "b4", "e2"]
奖励,如果您还可以给我看一个underscore.js版本。
JSFiddle链接在这里…
// Start function function findCategory(categoryName) { var trail = []; var found = false; function recurse(categoryAry) { for (var i=0; i < categoryAry.length; i++) { console.log(categoryAry[i].category); trail.push(categoryAry[i].category); // Found the category! if ((categoryAry[i].category === categoryName) || found) { console.log('FOUND'); found = true; console.log(trail); break; // Did not match... } else { // Are there children / sub-categories? YES if (categoryAry[i].children.length > 0) { console.log('recurse'); recurse(categoryAry[i].children); // NO } else { trail.pop(); if (i === categoryAry.length - 1) { trail.pop(); } } } } } return recurse(catalog); } console.clear(); console.log(findCategory('b4'));
例如,数组类别对象和类别对象的嵌套数组。假设嵌套深度未知。
var catalog = [ { category:"a1", children:[ { category:"a2", children:[] }, { category:"b2", children:[ { category:"a3", children:[] }, { category:"b3", children:[] } ] }, { category:"c2", children:[] } ] }, { category:"b1", children:[] }, { category:"c1", children:[ { category:"d2", children:[ { category:"c3", children:[] }, { category:"d3", children:[ { category:"a4", children:[] }, { category:"b4", children:[] }, { category:"c4", children:[] }, { category:"d4", children:[] } ] } ] }, { category:"e2", children:[ { category:"e3", children:[] } ] } ] } ];
尝试
function findCategory(categoryName) { var trail = []; var found = false; function recurse(categoryAry) { for (var i = 0; i < categoryAry.length; i++) { trail.push(categoryAry[i].category); // Found the category! if ((categoryAry[i].category === categoryName)) { found = true; break; // Did not match... } else { // Are there children / sub-categories? YES if (categoryAry[i].children.length > 0) { recurse(categoryAry[i].children); if(found){ break; } } } trail.pop(); } } recurse(catalog); return trail }
演示:小提琴