gpt4 book ai didi

javascript - 如何跳出递归函数中的循环?

转载 作者:可可西里 更新时间:2023-11-01 02:32:44 26 4
gpt4 key购买 nike

我正在处理一组类别对象,这些对象可以包含一组子类别对象。棘手的部分是这个嵌套数据的深度是未知的(并且可以改变)。 (请参阅底部的示例。)我正在尝试做的是将“踪迹”返回到类别对象,但我遇到了各种困难。

理想情况下,findCategory('b4') 会返回:['c1', 'd2', 'd3', 'b4'](参见示例) .

我认为我的问题是我无法正确地打破由递归引起的嵌套循环。有时我会在我的足迹中获得额外的类别,或者当我认为我已经突破时,一些更深的嵌套类别最终会出现在我的足迹中。

一个结果可能是这样的。很明显,它并没有终止 b4 处的循环,我不确定为什么会找到两次结果。

b4
FOUND
["c1", "d2", "d3", "b4"]
e2
FOUND
["c1", "d2", "d3", "b4", "e2"]

如果您还可以向我展示 underscore.js 版本,我将获得奖励。

JSFiddle Link这里……

// 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
}

演示:Fiddle

关于javascript - 如何跳出递归函数中的循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16228467/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com