我正在编写一个返回给定数组中最长字符串的函数。如果数组为空,则应返回空字符串(“”)。如果数组不包含字符串;它应该返回一个空字符串。
function longestWord(arr) {
var filtered = arr.filter(function(el) { return typeof el == 'number' });
if (filtered.length > 0) {
return Math.min.apply(Math, filtered);
} else {
return 0;
}
}
var output = longestWord([3, 'word', 5, 'up', 3, 1]);
console.log(output); // --> must be 'word'
现在我的代码不会拉出单词而是拉出数字。知道我错过了什么吗?
答案 0 :(得分:2)
让我们来看看你的代码。
longestWord
功能的第一行:
var filtered = arr.filter(function(el) { return typeof el == 'number' });
将基于typeof el === 'number'
过滤输入数组,这将返回一个仅包含输入数组type of === number
的元素的数组。
由于目标是找到最长的单词,因此应该更改为:
var filtered = arr.filter(function(el) { return typeof el === 'string' });
将返回输入数组中的字符串数组。
接下来,检查过滤后的数组是否为空。如果数组为空,则返回0
。您的指示说如果数组为空,或者数组不包含字符串,则应返回空字符串。所以我们应该改为:
return "";
如果数组不为空或包含字符串,则返回Math.min.apply(Math, filtered)
。此语句将返回数组的最小值,因此可能不是您想要的。毕竟,目标是返回最长的字符串。
要做到这一点,我们可以使用各种方法,这里是一个:
filtered.reduce(function(a, b) { return a.length > b.length ? a : b })
此语句使用reduce()
方法逐步执行数组并返回最长项。
把它们放在一起我们得到:
function longestWord(arr) {
var filtered = arr.filter(function(el) { return typeof el === 'string' });
if (filtered.length > 0) {
return filtered.reduce(function(a, b) { return a.length >= b.length ? a : b });
} else {
return "";
}
}
console.log(longestWord([3, 'word', 5, 'up', 3, 'testing', 1]));
console.log(longestWord([]));
console.log(longestWord([1, 2, 3, 4, 5]))
console.log(longestWord(['some', 'long', 'four', 'char', 'strs']))
答案 1 :(得分:1)
我认为过滤器意味着“字符串”
获得过滤后的数组后,您只需使用reduce来获取最长的单词
function longestWord(arr) {
return Array.isArray(arr) ?
arr
.filter(el => typeof el == 'string' )
.reduce((a,b) => b.length > a.length ? b : a) : '';
}
console.log(longestWord([3, 'word', 5, 'up', 3, 1, 'blah']));
更短的代码
var longestWord = (arr) => Array.isArray(arr) ? arr.reduce((a,b) => (typeof b == 'string' && b.length > a.length) ? b : a, '') : '';
答案 2 :(得分:0)
const longestWord = arr =>
arr.reduce((result, str) =>
typeof str == 'string' && result.length < str.length
? str
: result, '')
答案 3 :(得分:0)
这不是最有效的代码。为此,寻求其他答案,尤其是那些使用reduce
的答案,但我发现它更易读,更容易维护:
function longestWord(arr) {
var filtered = arr.filter(el => typeof el === 'string')
.sort((a,b) => a.length > b.length ? -1 : 1 );
if (filtered.length)
return filtered[0];
return null;
}
var output = longestWord([3, 'word', 5, 'up', 3, 1]);
console.log(output); // --> must be 'word'
&#13;
但是当两个字符串的长度相同时该怎么办?
答案 4 :(得分:0)
由于所有其他答案都使用filter()
,reduce()
以及所有新的和奇特的方法,我会用自己动手的方法(即旧时尚方式)回答。 / p>
function longestWord(arr) {
if ( ! ( typeof arr === 'array' ) ) {
console.log("That's not an array!");
return '';
}
var longest = ''; // By default, the longest word is the empty string
// Linear search
for ( var i = 0, length = arr.length; i < length; i++ ) {
var el = arr[i];
if ( typeof el === 'string' && el.length > longest.length ) {
// Words STRICTLY GREATER than the last found word.
// This way, only the first word (if two lengths match) will be considered.
longest = el;
}
}
return longest;
}
我知道,这可能是不你想要的,因为你已经在使用filtered()
,但它确实有效。