我正在写一个函数,该函数返回给定数组中最长的字符串。如果数组为空,则应返回一个空字符串(“”)。如果数组不包含任何字符串;它应该返回一个空字符串。
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'
现在我的代码没有拉这个词,而是拉出了数字。知道我想念什么吗?
最佳答案
让我们遍历您的代码。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']))