我正在尝试返回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');
答案 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()
将返回true
或false
,并会在true
返回后停止迭代。
some()
对数组中存在的每个元素执行一次回调函数,直到找到一个回调返回true值的元素。如果找到这样的元素,some()会立即返回true
。否则,some()
会返回false
。
答案 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;
}