在javascript中递归函数不返回标签

在javascript中递归函数不返回标签,javascript,recursion,Javascript,Recursion,我试图返回标签匹配,但我似乎在这里做了一些错误。有人能把我推向正确的方向吗 console.log('start'); var test = { "ID": 234324, "Label": "KDF", "children": [{ "ID": 234234, "Label": "KJDF", "children": [{ "ID": 234324, "Label": "K

我试图返回标签匹配,但我似乎在这里做了一些错误。有人能把我推向正确的方向吗

console.log('start');

var test = {
    "ID": 234324,
    "Label": "KDF",
    "children": [{
        "ID": 234234,
        "Label": "KJDF",
        "children": [{
            "ID": 234324,
            "Label": "KJDF"
        }, {
            "ID": 22323,
            "Label": "LKNDF"
        }, {
            "ID": 34535,
            "Label": "LKNSF"
        }]
    }, {
        "ID": 323434,
        "Label": "CLK"
    }]
}

function testThis(thing, ID) {
    if (thing.ID == ID) {
        console.log('match!')
        return thing.Label;
    } else if (thing.children && thing.children.length) {
        thing.children.forEach(function(x) {
            console.log(x);
            return testThis(x, ID);
        })
        return false;
    } else {
        return false;
    }



}




console.log(testThis(test, 323434));

console.log('end');

您希望
forEach
返回一些内容并离开循环。它总是返回
未定义的
,并且总是迭代每个元素

forEach()为每个数组元素执行一次回调函数; 与map()或reduce()不同,它总是返回未定义的值,并且 不可链接。典型的用例是在最短的时间内执行副作用 链条的末端

可能会更好地为您服务,因为它只执行部分元素并返回值


见下面的工作代码:

console.log('start');
var测试={
“ID”:1,
“标签”:“A”,
“儿童”:[{
“ID”:2,
“标签”:“B”,
“儿童”:[{
“ID”:5,
“标签”:“E”
}, {
“ID”:6,
“标签”:“F”
}, {
“ID”:7,
“标签”:“G”
}]
}, {
“ID”:3,
“标签”:“C”
}, {
“ID”:4,
“标签”:“D”,
“儿童”:[{
“ID”:8,
“标签”:“H”
}, {
“ID”:9,
“标签”:“我”
}]
}]
}
函数testThis(thing,ID){
if(thing.ID==ID){
console.log('match!')
退货。标签;
}else if(thing.children&&thing.children.length){
var-theone=null;
东西。孩子。一些(函数(x){
theone=testThis(x,ID);
返回theone;
})
返回theone;
}否则{
返回false;
}
}
警报(testThis(test,5));

console.log('end')
您希望
forEach
返回一些内容并离开循环。它总是返回
未定义的
,并且总是迭代每个元素

forEach()为每个数组元素执行一次回调函数; 与map()或reduce()不同,它总是返回未定义的值,并且 不可链接。典型的用例是在最短的时间内执行副作用 链条的末端

可能会更好地为您服务,因为它只执行部分元素并返回值


见下面的工作代码:

console.log('start');
var测试={
“ID”:1,
“标签”:“A”,
“儿童”:[{
“ID”:2,
“标签”:“B”,
“儿童”:[{
“ID”:5,
“标签”:“E”
}, {
“ID”:6,
“标签”:“F”
}, {
“ID”:7,
“标签”:“G”
}]
}, {
“ID”:3,
“标签”:“C”
}, {
“ID”:4,
“标签”:“D”,
“儿童”:[{
“ID”:8,
“标签”:“H”
}, {
“ID”:9,
“标签”:“我”
}]
}]
}
函数testThis(thing,ID){
if(thing.ID==ID){
console.log('match!')
退货。标签;
}else if(thing.children&&thing.children.length){
var-theone=null;
东西。孩子。一些(函数(x){
theone=testThis(x,ID);
返回theone;
})
返回theone;
}否则{
返回false;
}
}
警报(testThis(test,5));
console.log('end')你在哪里做

thing.children.forEach(function(x) {
使用而不是
.forEach()
,如下所示

return thing.children.some(function(x) {})
.forEach()
返回未定义,而
.some()
将返回
true
false
,并在返回
true
后停止迭代

some()。如果找到这样的元素,some()立即返回
true
。否则,
some()
返回
false

小提琴:你在哪里演奏

thing.children.forEach(function(x) {
使用而不是
.forEach()
,如下所示

return thing.children.some(function(x) {})
.forEach()
返回未定义,而
.some()
将返回
true
false
,并在返回
true
后停止迭代

some()。如果找到这样的元素,some()立即返回
true
。否则,
some()
返回
false


小提琴:

你不需要使用foreach,像这样使用一个普通的

function testThis(thing, ID) {
    if (thing.ID == ID) {
        return thing.Label;
    } else if (thing.children && thing.children.length) {
        var label;
        var length = thing.children.length
        for(var i = 0; i < length; i++) {
            label = testThis(thing.children[i], ID);
            if(label) {
                return label;
            }
        }
    }

    return false;
}
函数testThis(东西,ID){
if(thing.ID==ID){
退货。标签;
}else if(thing.children&&thing.children.length){
var标签;
变量长度=thing.childrence.length
对于(变量i=0;i
你不需要使用foreach,像这样使用一个普通的
for

function testThis(thing, ID) {
    if (thing.ID == ID) {
        return thing.Label;
    } else if (thing.children && thing.children.length) {
        var label;
        var length = thing.children.length
        for(var i = 0; i < length; i++) {
            label = testThis(thing.children[i], ID);
            if(label) {
                return label;
            }
        }
    }

    return false;
}
函数testThis(东西,ID){
if(thing.ID==ID){
退货。标签;
}else if(thing.children&&thing.children.length){
var标签;
变量长度=thing.childrence.length
对于(变量i=0;i
您可以不检查标签就返回标签。@MitchKarajohn
如果(标签)
是必需的,因为如果它是
false
并且我返回它,我不检查下一项,而只检查第一项您可以不检查标签就返回标签。@MitchKarajohn
如果(标签)
是必需的,因为如果它是
false
并且我返回它,我不会检查下一项,而只检查第一项。为什么要删除代码?现在,这个问题毫无意义。我回滚了你的问题,因为你的代码在修订版中仍然可见,而你的编辑现在使你的问题变得毫无用处。如果您再次编辑,请解释为什么要删除yo的大部分(和有用部分)