为什么在 reduce 函数中返回局部变量的长度会抛出错误?
Why does returning the length of a local variable in a reduce function throw an error?
目前正在做这个挑战: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);
}
知道为什么我不能 return a 或 b 的长度,即使它们应该是字符串吗?我显然在这里遗漏了一些东西...
谢谢
来自 .reduce()
回调的 return 值是每次回调调用连续传递的值。如果回调的第一次迭代 returns 只是 .length
值,那么 number 将传递给第二次迭代。当发生这种情况时,您的代码将尝试在一个不存在的数字上找到 .length
属性,并且您最终会处理 undefined
值。
因此,在代码的第一个(工作)版本中,首先调用回调,a
是拆分字符串的第一个单词,b
是第二个单词。它 return 是 a
或 b
。然后再次调用回调,第一次调用的结果为 a
,第三个单词为 b
。重复该过程,直到最后一个单词作为 b
传递并且最终字符串为 returned。然后,在 .reduce()
完成后,代码获取最短字符串的 .length
。
在第二个 (non-working) 版本中,第一次调用与工作版本中一样,第一个单词为 a
,第二个单词为 b
。回调 return 是较短单词的长度。因此,在第二次调用回调时,a
是一个数字(之前 return 的长度较短),b
是第三个单词。访问 a.length
将是 undefined
,因此比较将是 false
,函数将是 return a.length
,即 undefined
。因此,在回调的第三次调用中,a
将变为 undefined
,并且尝试访问 a.length
将引发异常。
另一种解决方案是先将字符串数组转换为数字数组,这样reduce操作就可以只对数字进行操作:
s.split(' ').map(x => x.length).reduce((a, b) => b < a ? b : a);
目前正在做这个挑战: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);
}
知道为什么我不能 return a 或 b 的长度,即使它们应该是字符串吗?我显然在这里遗漏了一些东西...
谢谢
来自 .reduce()
回调的 return 值是每次回调调用连续传递的值。如果回调的第一次迭代 returns 只是 .length
值,那么 number 将传递给第二次迭代。当发生这种情况时,您的代码将尝试在一个不存在的数字上找到 .length
属性,并且您最终会处理 undefined
值。
因此,在代码的第一个(工作)版本中,首先调用回调,a
是拆分字符串的第一个单词,b
是第二个单词。它 return 是 a
或 b
。然后再次调用回调,第一次调用的结果为 a
,第三个单词为 b
。重复该过程,直到最后一个单词作为 b
传递并且最终字符串为 returned。然后,在 .reduce()
完成后,代码获取最短字符串的 .length
。
在第二个 (non-working) 版本中,第一次调用与工作版本中一样,第一个单词为 a
,第二个单词为 b
。回调 return 是较短单词的长度。因此,在第二次调用回调时,a
是一个数字(之前 return 的长度较短),b
是第三个单词。访问 a.length
将是 undefined
,因此比较将是 false
,函数将是 return a.length
,即 undefined
。因此,在回调的第三次调用中,a
将变为 undefined
,并且尝试访问 a.length
将引发异常。
另一种解决方案是先将字符串数组转换为数字数组,这样reduce操作就可以只对数字进行操作:
s.split(' ').map(x => x.length).reduce((a, b) => b < a ? b : a);