为什么在 reduce 函数中返回局部变量的长度会引发错误?



目前正在做这个挑战:https://www.codewars.com/kata/shortest-word/train/javascript

查找字符串中单词的最短长度。

这有效:

function findShort(s){
return s.split(' ').reduce((a, b) => b.length < a.length ? b : a).length;
}

但这不会:

function findShort(s){
return s.split(' ').reduce((a, b) => b.length < a.length ? b.length : a.length);
}

知道为什么我不能返回 a 或 b 的长度,即使它们应该是字符串吗?我在这里显然错过了一些东西...

谢谢

.reduce()

回调的返回值是每次调用回调时依次传递的值。如果回调的第一次迭代仅返回.length值,则该数字将传递给第二次迭代。发生这种情况时,您的代码将尝试查找不存在的数字上的.length属性,并且您最终会处理一个undefined值。

因此,在代码的第一个(工作)版本中,首先调用回调,a是拆分字符串的第一个单词,b是第二个单词。它返回ab。然后再次调用回调,第一次调用的结果为a,第三个单词为b。该过程将重复,直到最后一个单词作为b传递并返回最后一个字符串。然后,在.reduce()完成后,代码将获取该最短字符串的.length

在第二个(非工作)版本中,第一个调用与工作版本相同,第一个单词为a,第二个单词为b。回调返回较短单词的长度。因此,在第二次调用回调时,a是一个数字(之前返回的较短长度),b是第三个单词。访问a.length将被undefined,因此比较将被false,函数将返回a.length,即undefined。因此,在第三次调用回调时,a将被undefined,并且尝试访问a.length将引发异常。

另一种解决方案是先将字符串数组转换为数字数组,因此 reduce 操作可以只对数字进行操作:

s.split(' ').map(x => x.length).reduce((a, b) => b < a ? b : a);

最新更新