Gibt es eine kurze Möglichkeit, die längste Zeichenfolge in einem Zeichenfolgenarray zu finden?
So etwas wie arr.Max(x => x.Length);?
Gibt es eine kurze Möglichkeit, die längste Zeichenfolge in einem Zeichenfolgenarray zu finden?
So etwas wie arr.Max(x => x.Length);?
Antworten:
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; });
aund bdefiniert sind. Aber ich bin angenehm überrascht, wie elegant die Lösung ist.
reducemit einer Rückruffunktion verwenden können, die ein Array zurückgibt.
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.
Eine neue Antwort auf eine alte Frage: In ES6 können Sie kürzer machen:
Math.max(...(x.map(el => el.length)));
O(n^2)während die meisten anderen Optionen die Sammlung nur einmal durchlaufen O(n). Benutzerdefinierte Komparatoren verwenden sortmöglicherweise sogarO(log(n))
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);
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");
Verwenden von Array.prototype - (Die Sortierung ähnelt der von @katsPaugh und @deceze geposteten, während ich eine Geige machte.)
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());
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)
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 .
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']))
arr.reduce(function(savedText, text) { return text.length > savedText.length ? text : savedText; }, '');
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
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");
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");
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.
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");
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))
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
});
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])
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;
}
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);