目前正在做这个挑战: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
是第二个单词。它返回a
或b
。然后再次调用回调,第一次调用的结果为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);