我不久前在不久前发布了一个关于我试图解决的kata的问题。在那个问题中,(如果感兴趣The documentation这里找到)我需要在我的函数中添加return
语句,这样我就可以避免以下错误Value is not what was expected
。
现在我的第二次迭代我的kata解决方案试用了,这里是:
function isMerge(s, part1, part2) {
var pointer = 0
splitString = s.split('');
splitString.forEach(function(character) {
if (part1.includes(character) || part2.includes(character)) {
pointer++;
return true;
} else {
return false;
}
});
}
isMerge('codewars','cdw','oears')
当我尝试执行代码时,我仍然遇到Value is not what was expected
错误,这次我很困惑为什么会发生这种情况。
对于初学者,取自MDN指南
return语句结束函数执行并指定要返回给函数调用者的值。
表达 要返回的表达式。如果省略,则返回undefined。
查看我的if/else
逻辑我在return true
循环中指定了return false
和forEach
条件,以查看来自part1
和{的所有字符{1}}在字符串中。我要回信了,为什么我有part2
?
其次,根据Value is not what was expected
语句的定义,该函数应该在到达该关键字时停止。但是,当我在逻辑中放置return
时,我可以在我的控制台上看到正在输出所有字符,因此在执行console.log(character)
时函数根本不会中断。这是为什么?
第三,我很困惑何时一般使用return true
关键字。请考虑return
的MDN文档中的这些示例。
示例1:
ForEach
示例2:
function logArrayElements(element, index, array) {
console.log('a[' + index + '] = ' + element);
}
// Notice that index 2 is skipped since there is no item at
// that position in the array.
[2, 5, , 9].forEach(logArrayElements);
// logs:
// a[0] = 2
// a[1] = 5
// a[3] = 9
这些示例中没有一个function Counter() {
this.sum = 0;
this.count = 0;
}
Counter.prototype.add = function(array) {
array.forEach(function(entry) {
this.sum += entry;
++this.count;
}, this);
// ^---- Note
};
var obj = new Counter();
obj.add([2, 5, 9]);
obj.count
// 3
obj.sum
// 16
语句。
现在看看这个return
示例。
.every
最后,根据我之前的问题,我需要添加这样的第二个function isBigEnough(element, index, array) {
return element >= 10;
}
[12, 5, 8, 130, 44].every(isBigEnough);
语句以避免值错误。
return
所以.......总之,对于我的原始函数启动了这个,当我到达function isBigEnough(element, index, array) {
return element >= 10;
}
function whenToUseReturn(array) {
return array.every(isBigEnough);
}
whenToUseReturn([12, 5, 8, 130, 44]);
时我应该退出循环并返回它同样当所有字符都在字符串中时,如何返回'累积'为真并避免出现值错误。我希望这是有道理的,我可以通过编辑来澄清,以更好地说明我的观点。
答案 0 :(得分:1)
我的朋友,因为你决定采用"回调方式"使用.each等,你应该考虑使用回调,因为在这种情况下你不能返回任何东西。如果您不希望采用回调方式,只需使用标准的javascript,例如:
can_apply
替换为
splitString.forEach(function(character) {
现在你可以回来了。使用"每个"只需要循环一个数组,就可以防止你返回。
答案 1 :(得分:1)
我要回信了,为什么我的价值不符合预期?
return
语句从您从forEach
传递到isMerge
,而不是的回调中返回。 return
语句不跨越函数边界。 isMerge
不包含return语句,因此返回undefined
。如果我们稍微重写函数,它可能会变得更清晰:
function doSomething(part1, part2) {
return function(character) {
if (part1.includes(character) || part2.includes(character)) {
return true;
} else {
return false;
}
}
}
function isMerge(s, part1, part2) {
splitString = s.split('');
splitString.forEach(doSomething(part1, part2));
}
isMerge('codewars','cdw','oears')
这相当于您的代码。如您所见,return
中没有isMerge
语句。
在这些示例中没有一个返回语句。
return
示例中没有forEach
个语句,因为forEach
对回调的返回值没有任何作用,所以没有返回任何东西。
forEach
只是迭代数组的一种不同方式,但它不会产生reduce
或every
之类的值。
当我达到false并且返回它时我应该如何退出循环,同样当所有字符都在字符串中时,如何返回'cumulative'true并避免Value错误。
您无法退出forEach
“循环”。如果您必须提前停止迭代,则需要使用正常的for
(for/in
,for/of
)循环。
要返回并生成值,您可以使用使用every
的原始解决方案。