获得最长的词 - JS

时间:2017-06-22 04:04:53

标签: javascript arrays

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

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'

现在我的代码不会拉出单词而是拉出数字。知道我错过了什么吗?

5 个答案:

答案 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的答案,但我发现它更易读,更容易维护:

&#13;
&#13;
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;
&#13;
&#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(),但它确实有效。