递归函数未在javascript

时间:2016-03-16 23:27:12

标签: javascript recursion

我正在尝试返回Label匹配,但我似乎在这里做错了。有人能把我推向正确的方向吗?

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');

3 个答案:

答案 0 :(得分:0)

你期望forEach返回一些东西并离开循环。它始终返回undefined并始终迭代每个元素。

  

forEach()为每个数组元素执行一次回调函数;   与map()或reduce()不同,它总是返回undefined值而且是   不可链接。典型的用例是执行副作用   链的一端。

请参阅MDN forEach

Array.prototype.some()可能会更好地为您服务,因为它只会执行某些元素并返回一个值。

请参阅下面的工作代码:

console.log('start');

var test = {
  "ID": 1,
  "Label": "A",
  "children": [{
    "ID": 2,
    "Label": "B",
    "children": [{
      "ID": 5,
      "Label": "E"
    }, {
      "ID": 6,
      "Label": "F"
    }, {
      "ID": 7,
      "Label": "G"
    }]
  }, {
    "ID": 3,
    "Label": "C"
  }, {
    "ID": 4,
    "Label": "D",
    "children": [{
      "ID": 8,
      "Label": "H"
    }, {
      "ID": 9,
      "Label": "I"
    }]
  }]
}

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

alert(testThis(test, 5));

console.log('end');

答案 1 :(得分:0)

你在哪里

thing.children.forEach(function(x) {

使用.some()代替.forEach(),就像这样

return thing.children.some(function(x) {})

.forEach()返回undefined,而.some()将返回truefalse,并会在true返回后停止迭代。

  

some()对数组中存在的每个元素执行一次回调函数,直到找到一个回调返回true值的元素。如果找到这样的元素,some()会立即返回true。否则,some()会返回false

小提琴: https://jsfiddle.net/mkarajohn/7ebr6pna/

答案 2 :(得分:0)

你不需要使用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;
}