配列内で最長の文字列を検索する


84

文字列配列で最長の文字列を見つける簡単な方法はありますか?

のようなものarr.Max(x => x.Length);

回答:


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];

同じサイズの文字列が2つ以上あり、結果が配列になる場合はどうなりますか?その場合、reduceは機能せず、最初の結果を繰り返す必要があります。
GismoRanas18年

@GismoRanasこれは別の質問ですがreduce、配列を返すコールバック関数で引き続き使用できます。
–deceze

34

古い質問に対する新しい答え:ES6ではより短くすることができます:

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

7
これは、最長の文字列ではなく、最長の文字列の長さを返します。
Mikemike

注意すべきもう1つの点は、これはコレクションを2回トラバースすることです。O(n^2)ここで、他のほとんどのオプションはコレクションを1回だけトラバースします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 2016

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:undefinedは関数ではありません
公爵

@duke見てみましょうが、問題の背後にあるものを推測します。
マティアスFidemraizer

@dukeところで、入力をお願いできますか?コードをそのまま使用していますか?
マティアスFidemraizer

下記参照。しかし、それは一見コンパイルすらしていません。しかし、あなたは正しいです:あなたのコードだけを使用することはうまくいきます.... let obj = {"HostName":{"Generated": "@logon"、 "Value": "openPI"、 "LastRun": "2018-11- 15 07:57:50,186 "}、" HostIp ":{"生成された ":" @ cron "、"値 ":" 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 2017

1
これは長さを与えますが、単語は与えません
brk 2018年

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 +以降、Eachの配列関数がサポートされています。


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; }, '');
maxshuty

2

私はジェイソンの機能に触発され、少し改善を加えた結果、かなり高速なファインダーを手に入れました。

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

最新のブラウザはfor...ofループをサポートしています。Chrome、Safari、Edge、Firefoxでこの問題を解決するための最速かつ最短の方法も最も明確です。

let largest = '';
for (let item of arr) {
  if (item.length > largest.length) largest = item
}

IEでは、Array.forEach ;を使用できます。これは、配列を並べ替えたり縮小したりするよりも高速で明確です。

var largest = '';
arr.forEach(function(item) {
  if (item.length > largest.length) largest = item
});

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);

またはArrow関数を使用するよりクリーンな方法:var findLongestWord = function(array){var longest = array.reduce((a、b)=> {return(a.length> b.length)?a:b;}); 最も長く戻る; }
Ash Khan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.