我正在写一个函数,该函数返回给定数组中最长的字符串。如果数组为空,则应返回一个空字符串(“”)。如果数组不包含任何字符串;它应该返回一个空字符串。

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']))

09-05 19:10