Suche nach der längsten Zeichenfolge im Array

84

Gibt es eine kurze Möglichkeit, die längste Zeichenfolge in einem Zeichenfolgenarray zu finden?

So etwas wie arr.Max(x => x.Length);?

Neir0
quelle
Ich denke du fragst so etwas wie LINQ, habe ich recht? Wie ich sehe, geben die meisten Antworten einen Vergleich der Stringlänge an, aber möchten Sie den Artikel mit einer anderen Eigenschaft oder nur mit Stringlänge erhalten?
Caltuntas

Antworten:

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

Wahrscheinlich effizienter, aber erst seit Javascript 1.8 / ECMAScript 5 verfügbar und in älteren Browsern standardmäßig nicht verfügbar:

var longest = arr.reduce(function (a, b) { return a.length > b.length ? a : b; });
täuschen
quelle
@deceze Verzeihen Sie meine Unwissenheit, aber ich bin ein bisschen verwirrt, wie die Funktion sortieren können mehr als zwei Variablen, wenn nur zwei Variablen aund bdefiniert sind. Aber ich bin angenehm überrascht, wie elegant die Lösung ist.
Ryan Ward
Was ist, wenn zwei oder mehr Zeichenfolgen derselben Größe vorhanden sind und das Ergebnis ein Array sein sollte? Reduzieren funktioniert in diesem Fall nicht und Sie müssen das erste Ergebnis wiederholen.
Gismo Ranas
@GismoRanas Das ist eine andere Frage, die Sie immer noch reducemit einer Rückruffunktion verwenden können, die ein Array zurückgibt.
Täuschung
@deceze ja, aber ich denke, das ist am sichersten, weil man normalerweise nicht im Voraus sagen kann, ob es eine oder mehrere max. Auch viele Leute landen hier von einer Google-Suche und benötigen sie möglicherweise. Überprüfen Sie meine Antwort unten, wenn Sie an einer Lösung des allgemeinen Problems stackoverflow.com/a/49263350/1153600
Gismo Ranas
@Gismo Es ist eine ganz andere Anforderung, die längste Zeichenfolge (dh eine der längsten Zeichenfolgen, Singular) oder die längsten Zeichenfolgen (Plural) zu finden. Für letztere können Sie reduceein Array verwenden und auf dieses reduzieren, indem Sie es mit dem Array verknüpfen, wenn die aktuelle Zeichenfolgenlänge der Länge der akkumulierten Zeichenfolgen entspricht, ein neues Array, wenn es länger ist, oder das vorhandene Array, wenn es kürzer ist (die Implementierung ist etwas lang für ein Kommentar). Funktioniert ohne externe Bibliothek und einzelne Iteration.
Täuschung
34

Eine neue Antwort auf eine alte Frage: In ES6 können Sie kürzer machen:

Math.max(...(x.map(el => el.length)));
Dávid Veszelovszki
quelle
7
Dies gibt die Länge der längsten Zeichenfolge zurück, nicht die längste Zeichenfolge.
Mikemike
Eine andere zu beachtende Sache ist, dass dies die Sammlung zweimal durchläuft, O(n^2)während die meisten anderen Optionen die Sammlung nur einmal durchlaufen O(n). Benutzerdefinierte Komparatoren verwenden sortmöglicherweise sogarO(log(n))
CTS_AE
27

Ich würde so etwas tun

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

alert(longest);

http://jsfiddle.net/jasongennaro/MLqLq/

Jason Gennaro
quelle
2
Dies ist die beste, da sie Ihr Array nicht beeinflusst. Wenn Sie dagegen (wie in der gewählten Antwort) sortieren, wird Ihr Array sortiert, wenn Sie das manchmal nicht möchten. +1, danke
thatOneGuy
Ich würde etwas Ähnliches tun. Wenn die Funktion darin bestand, das Longes-Wort in einer Zeichenfolge zurückzugeben: 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");
Andy Smith
4
var arr = [ 'fdgdfgdfg', 'gdfgf', 'gdfgdfhawsdgd', 'gdf', 'gdfhdfhjurvweadsd' ];
arr.sort(function (a, b) { return b.length - a.length })[0];
katspaugh
quelle
4

Verwenden von Array.prototype - (Die Sortierung ähnelt der von @katsPaugh und @deceze geposteten, während ich eine Geige machte.)

DEMO HIER

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());    
mplungjan
quelle
4

Ich biete einen funktionalen + rekursiven Ansatz. Lesen Sie die Kommentare, um zu verstehen, wie es funktioniert:

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)

Matías Fidemraizer
quelle
Irgendeine Idee, warum das bei mir nicht funktioniert? const longestRec = längstes Wort => ([nextWord, ... words]) => ^ TypeError: undefined ist keine Funktion
Herzog
@duke Ich werde einen Blick darauf werfen, aber ich denke, was hinter dem Problem steckt.
Matías Fidemraizer
@duke Übrigens, kannst du mir den Input geben? Verwenden Sie den Code so wie er ist ?
Matías Fidemraizer
siehe unten. aber es kompiliert nicht einmal scheinbar. aber Sie haben Recht: Nur Ihren Code zu verwenden funktioniert einwandfrei .... let 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"}};
Herzog
Es tut mir leid, dass ich Sie gestört habe. Ich dachte, es wurde nicht kompiliert. Ich habe kein Array.
Herzog
3

Ich sehe die kürzeste Lösung

function findLong(s){
  return Math.max.apply(null, s.split(' ').map(w => w.length));
}
Giancarlo Ventura
quelle
1
Ich bevorzuge dieses, obwohl es vielleicht nicht das schnellste ist
guhur
1
Dies gibt Länge, aber nicht das Wort
brk
3

Vielleicht nicht die schnellste, aber sicherlich ziemlich lesbar:

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"

Die Array-Funktion forEach wird seit IE9 + unterstützt .

Niels van Reijmersdal
quelle
3

In ES6 könnte dies mit einem reduce()Aufruf zur O(n)Komplexität erreicht werden, im Gegensatz zu Lösungen, sort()die Folgendes verwenden O(nlogn):

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

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

Alex Lomia
quelle
1
Ich hoffe, dass mehr Leute so weit nach unten scrollen, denn dies sollte die akzeptierte Antwort sein. Wenn Sie aus irgendeinem Grund die ES5-Syntax benötigen und die Fettpfeilfunktion (trauriges Gesicht) nicht verwenden können, können Sie dies tun:arr.reduce(function(savedText, text) { return text.length > savedText.length ? text : savedText; }, '');
maxshuty
2

Ich war von Jasons Funktion inspiriert und habe sie ein wenig verbessert und dadurch einen ziemlich schnellen Finder erhalten:

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

Geschwindigkeitsergebnisse: http://jsperf.com/longest-string-in-array/7

Timo Kähkönen
quelle
1

Ich werde so etwas tun:

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");
Siawash Kasra
quelle
1

Wenn Ihre Zeichenfolge bereits in ein Array aufgeteilt ist, benötigen Sie den geteilten Teil nicht.

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");
Andy Smith
quelle
1

Wenn Sie mehr als ein Maximum erwarten, funktioniert dies:

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

Es verwendet lodash und gibt ein Array zurück.

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

es kann Arbeit sein

Jack Chen
quelle
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");
Barnet
quelle
Hat dieses Add etwas zu der bereits umfangreichen Liste der vorhandenen Antworten? Nr.
luk2302
0

Mit ES6 unterstützt auch doppelte Zeichenfolge

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))
Taha Azzabi
quelle
0

Moderne Browser unterstützen eine for...ofSchleife. Der schnellste und kürzeste Weg, um dieses Problem in Chrome, Safari, Edge und Firefox zu lösen, ist auch der klarste:

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

Im IE können Sie verwendenArray.forEach ; Das ist immer noch schneller und klarer als das Sortieren oder Reduzieren des Arrays.

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

Das ist meine einfache Lösung

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])
Alex Irabor
quelle
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;
}
EMATade
quelle
2
Während dieser Code das Problem des OP lösen kann, ist es am besten, eine Erklärung beizufügen, wie Ihr Code das Problem des OP behebt. Auf diese Weise können zukünftige Besucher aus Ihrem Beitrag lernen und ihn auf ihren eigenen Code anwenden. SO ist kein Codierungsdienst, sondern eine Ressource für Wissen. Es ist auch wahrscheinlicher, dass qualitativ hochwertige, vollständige Antworten positiv bewertet werden. Diese Funktionen sowie die Anforderung, dass alle Beiträge in sich geschlossen sind, sind einige der Stärken von SO als Plattform, die es von Foren unterscheidet. Sie können bearbeiten, um zusätzliche Informationen hinzuzufügen und / oder Ihre Erklärungen durch Quellendokumentation zu ergänzen.
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);
Ash Khan
quelle
oder sauberer mit der Pfeilfunktion: var findLongestWord = Funktion (Array) {var längste = array.reduce ((a, b) => {return (a.length> b.length)? a: b;}); am längsten zurückkehren; }
Ash Khan