查找数组中最长的字符串


84

在字符串数组中找到最长的字符串有一种简便的方法吗?

arr.Max(x => x.Length);什么?

Answers:


194

Javascript 1.8 / ECMAScript 5起可用,并且在大多数较旧的浏览器中可用:

var longest = arr.reduce(
    function (a, b) {
        return a.length > b.length ? a : b;
    }
);

否则,一个安全的替代方法:

var longest = arr.sort(
    function (a, b) {
        return b.length - a.length;
    }
)[0];

如果有两个或更多个相同大小的字符串,结果应该是数组怎么办?在这种情况下,reduce无法使用,您必须迭代第一个结果。
Gismo Ranas

@GismoRanas这是一个不同的问题,您仍然可以使用reduce返回数组的回调函数。
deceze

34

对一个老问题的新答案:在ES6中,您可以做得更短:

Math.max(...(x.map(el => el.length)));

7
这将返回最长字符串的长度,而不是最长字符串。
Mikemike

要注意的另一件事是,这将遍历集合两次,O(n^2)而大多数其他选项将仅遍历一次集合O(n)。自定义比较器可能使用的sort甚至是O(log(n))
CTS_AE,

27

我会做这样的事情

var arr = [
  'first item',
  'second item is longer than the third one',
  'third longish item'
];

var lgth = 0;
var longest;

for (var i = 0; i < arr.length; i++) {
  if (arr[i].length > lgth) {
    var lgth = arr[i].length;
    longest = arr[i];
  }
}

console.log(longest);


2
这是最好的选择,因为它不会影响您的数组。而如果您对数组进行排序(如选择的答案),则有时会对数组进行排序。+1,谢谢
thatOneGuy

4
var arr = [ 'fdgdfgdfg', 'gdfgf', 'gdfgdfhawsdgd', 'gdf', 'gdfhdfhjurvweadsd' ];
arr.sort(function (a, b) { return b.length - a.length })[0];

4

使用Array.prototype-(排序类似于我在提琴时@katsPaugh和@deceze发布的内容)

在这里演示

var arr = [
    "2 --",
    "3 ---",
    "4 ----",
    "1 -",
    "5 -----"
];

Array.prototype.longest=function() {
    return this.sort(
      function(a,b) {  
        if (a.length > b.length) return -1;
        if (a.length < b.length) return 1;
          return 0
      }
    )[0];
}
alert(arr.longest());    

4

我提供了一种功能+递归方法。查看评论以了解其工作原理:

const input1 = ['a', 'aa', 'aaa']
const input2 = ['asdf', 'qwer', 'zxcv']
const input3 = ['asdfasdf fdasdf a sd f', ' asdfsdf', 'asdfasdfds', 'asdfsdf', 'asdfsdaf']
const input4 = ['ddd', 'dddddddd', 'dddd', 'ddddd', 'ddd', 'dd', 'd', 'd', 'dddddddddddd']

// Outputs which words has the greater length
// greatestWord :: String -> String -> String
const greatestWord = x => y => 
      x.length > y.length ? x : y
      
// Recursively outputs the first longest word in a series
// longestRec :: String -> [String] -> String
const longestRec = longestWord => ([ nextWord, ...words ]) =>
      //                                ^^^^^^^^^^^^
      // Destructuring lets us get the next word, and remaining ones!
      nextWord // <-- If next word is undefined, then it won't recurse.
        ? longestRec (greatestWord (nextWord) (longestWord)) (words) 
        : longestWord


// Outputs the first longest word in a series
// longest :: [String] -> String
const longest = longestRec ('')

const output1 = longest (input1)
const output2 = longest (input2) 
const output3 = longest (input3)
const output4 = longest (input4)

console.log ('output1: ', output1)
console.log ('output2: ', output2)
console.log ('output3: ', output3)
console.log ('output4: ', output4)


知道为什么这对我不起作用吗?const longestRec = longestWord =>([[nextWord,... words])=> ^ TypeError:未定义不是函数
duke

@duke我来看一下,但是我想问题出在哪里。
马蒂亚斯Fidemraizer

@duke BTW,您能给我输入吗?您是否按原样使用代码?
马蒂亚斯Fidemraizer

见下文。但它似乎并没有编译。但您是对的:仅使用代码即可正常工作。...让obj = {“ HostName”:{“ Generated”:“ @logon”,“ Value”:“ openPI”,“ LastRun”:“ 2018-11- 15 07:57:50,186“},” HostIp“:{” Generated“:” @cron“,” Value“:” 192.168.178.70“,” LastRun“:” 2018-11-15 02:49:23,961“} ,“ Release”:{“ Generated”:“ @cron”,“ Value”:“ Raspbian GNU / Linux 9(stretch)”,“ LastRun”:“ 2018-11-15 02:49:24,099”}};
公爵

很抱歉打扰您,我认为它没有编译。我没有数组。
公爵

3

我看到了最短的解决方案

function findLong(s){
  return Math.max.apply(null, s.split(' ').map(w => w.length));
}

1
我更喜欢那一种,尽管它可能不是最快的一种
guhur

1
这给出了长度,但没有给出单词
brk

3

也许不是最快的,但是可读性很强:

function findLongestWord(array) {
  var longestWord = "";

  array.forEach(function(word) {
    if(word.length > longestWord.length) {
      longestWord = word;
    }
  });

  return longestWord;
}

var word = findLongestWord(["The","quick","brown", "fox", "jumped", "over", "the", "lazy", "dog"]);
console.log(word); // result is "jumped"

自IE9 +以来,已支持forEach的数组函数。


3

在此ES6可以用一个来完成reduce()呼叫O(n)的复杂性,而不是使用的解决方案sort()O(nlogn)

const getLongestText = (arr) => arr.reduce(
  (savedText, text) => (text.length > savedText.length ? text : savedText),
  '',
);

console.log(getLongestText(['word', 'even-longer-word', 'long-word']))


1
我希望更多的人向下滚动,因为这应该是公认的答案。如果由于某些原因您需要ES5语法并且不能使用arr.reduce(function(savedText, text) { return text.length > savedText.length ? text : savedText; }, '');

2

我从Jason的功能中得到启发,并对它进行了一些改进,从而使查找器变得相当快:

function timo_longest(a) {
  var c = 0, d = 0, l = 0, i = a.length;
  if (i) while (i--) {
    d = a[i].length;
    if (d > c) {
      l = i; c = d;
    }
  }
  return a[l];
}
arr=["First", "Second", "Third"];
var longest = timo_longest(arr);

速度结果:http//jsperf.com/longest-string-in-array/7


1

我会做这样的事情:

function findLongestWord(str) {
var array = str.split(" ");
var maxLength=array[0].length;
for(var i=0; i < array.length; i++ ) {
if(array[i].length > maxLength) maxLength = array[i].length}
return maxLength;}

findLongestWord("What if we try a super-long word such as otorhinolaryngology");

1

如果您的字符串已经拆分为数组,则不需要拆分部分。

function findLongestWord(str) {
  str = str.split(' ');
  var longest = 0;

  for(var i = 0; i < str.length; i++) {
     if(str[i].length >= longest) {
       longest = str[i].length;
        } 
     }
  return longest;
}
findLongestWord("The quick brown fox jumped over the lazy dog");

1

如果您期望超过一个最大值,则可以使用:

_.maxBy(Object.entries(_.groupBy(x, y => y.length)), y => parseInt(y[0]))[1]

它使用lodash并返回一个数组。


0
var longest = (arr) => {
  let sum = 0
  arr.map((e) => {
    sum = e.length > sum ? e.length : sum
  })
  return sum
}

可以的


0
function findLongestWord(str) {
  str = str.split(" ");
  var sorted = str.sort(function(prev,current){
    return prev.length - current.length;   
  });
  var index = sorted.length;
  str = sorted[index-1];
  return str;
}
findLongestWord("The quick brown fox jumped over the lazy dog");

这是否会在现有答案的本已广泛的列表中添加任何内容?号
luk2302

0

支持ES6的同时也重复字符串

var allLongestStrings = arrayOfStrings => {
  let maxLng = Math.max(...arrayOfStrings.map( elem => elem.length))
  return arrayOfStrings.filter(elem => elem.length === maxLng)
}

let arrayOfStrings = ["aba", "aa", "ad", "vcd","aba"]

console.log(allLongestStrings(arrayOfStrings))


0

这是我的简单解决方案

var arr = ["you", "are", "the", "love", "of", "my", "life"];
var sorted = arr.sort(function (a, b){
     return b.length - a.length;
});

console.log(sorted[0])

0
function allLongestStrings(array) {
    const newArr=[];
    let temp =    Math.max(...(array.map(el => el.length)));    
     array.forEach(item => {
        if(temp == item.length){
          newArr.push(item);
        }
    });
    return newArr;
}

2
尽管此代码可以解决OP的问题,但最好包含有关您的代码如何解决OP的问题的说明。这样,将来的访问者可以从您的帖子中学习,并将其应用于自己的代码。SO不是编码服务,而是知识资源。而且,更可能会推荐高质量,完整的答案。这些功能以及所有帖子都必须自成体系的要求,是SO作为平台的强项,可以将其与论坛区分开。您可以编辑以添加其他信息和/或在源文档中补充说明。
ysf

-1
var array = ["hello","falsey","undefined"];
var findLongestWord = function(array){
    var longest = array.reduce(function(a,b){
    return (a.length > b.length) ? a : b;
  });
    return longest;
}
findLongestWord(array);

或者使用箭头函数更简洁的方法:var findLongestWord = function(array){var longest = array.reduce((a,b)=> {return(a.length> b.length)?a:b;}); 返回最长 }
Ash Khan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.