2

目前这样做的挑战:https://www.codewars.com/kata/shortest-word/train/javascript为什么在reduce函数中返回局部变量的长度会引发错误?

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

这工作:

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

任何想法,为什么我不能返回的长度或b即使它们应该是字符串?我清楚地缺少的东西在这里...

感谢

+0

你不需要编写自己的逻辑来找到列表的最小值--Math.min已经做到了。尝试'Math.min(... s.split('').map(({length})=> length)'。 – 2017-01-22 17:03:21

回答

2

.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将引发异常。

+0

谢谢,现在有道理!我太专注于.length了。首先减少作品。 – Nymik

0

另一种解决方案是将字符串数组转换第一个数字数组,所以减少操作可以在数字只是操作:

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

好计划,蝙蝠侠! – Nymik

相关问题