Czy istnieje krótki sposób na znalezienie najdłuższego ciągu w tablicy ciągów?
Coś jak arr.Max(x => x.Length);
?
javascript
Neir0
źródło
źródło
reduce
funkcji wywołania zwrotnego, która zwraca tablicę.Nowa odpowiedź na stare pytanie: w ES6 możesz zrobić krócej:
Math.max(...(x.map(el => el.length)));
źródło
O(n^2)
większość innych opcji przejdzie przez kolekcję tylko razO(n)
. Niestandardowe komparatory mogąsort
nawet używaćO(log(n))
O(n) + O(n) = O(n)
nie jestO(n^2)
.Zrobiłbym coś takiego
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);
źródło
var arr = [ 'fdgdfgdfg', 'gdfgf', 'gdfgdfhawsdgd', 'gdf', 'gdfhdfhjurvweadsd' ]; arr.sort(function (a, b) { return b.length - a.length })[0];
źródło
Korzystanie z Array.prototype - (sortowanie jest podobne do tego, co opublikowali @katsPaugh i @deceze, gdy grałem na skrzypcach)
DEMO TUTAJ
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());
źródło
Zapewniam podejście funkcjonalne + rekurencyjne. Zobacz komentarze, aby zrozumieć, jak to działa:
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)
źródło
Widzę najkrótsze rozwiązanie
function findLong(s){ return Math.max.apply(null, s.split(' ').map(w => w.length)); }
źródło
Może nie najszybszy, ale z pewnością całkiem czytelny:
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"
Funkcja tablicowa forEach jest obsługiwana od IE9 + .
źródło
W ES6 może to być osiągnięte za pomocą
reduce()
połączenia wO(n)
złożoności, w przeciwieństwie do rozwiązań wykorzystującychsort()
który jestO(nlogn)
:const getLongestText = (arr) => arr.reduce( (savedText, text) => (text.length > savedText.length ? text : savedText), '', ); console.log(getLongestText(['word', 'even-longer-word', 'long-word']))
źródło
arr.reduce(function(savedText, text) { return text.length > savedText.length ? text : savedText; }, '');
Zainspirowała mnie funkcja Jasona i dokonałem w niej niewielkich ulepszeń, w wyniku czego znalazłem dość szybką wyszukiwarkę:
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);
Wyniki dotyczące prędkości: http://jsperf.com/longest-string-in-array/7
źródło
Zrobię coś takiego:
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");
źródło
Jeśli twój ciąg jest już podzielony na tablicę, nie będziesz potrzebować podzielonej części.
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");
źródło
Jeśli spodziewasz się więcej niż jednego maksimum, zadziała to:
_.maxBy(Object.entries(_.groupBy(x, y => y.length)), y => parseInt(y[0]))[1]
Używa lodash i zwraca tablicę.
źródło
var longest = (arr) => { let sum = 0 arr.map((e) => { sum = e.length > sum ? e.length : sum }) return sum }
to może być praca
źródło
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");
źródło
Z obsługą ES6 również zduplikowany ciąg
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))
źródło
Nowoczesne przeglądarki obsługują
for...of
pętlę. Najszybszy i najkrótszy sposób rozwiązania tego problemu w Chrome, Safari, Edge i Firefox jest również najwyraźniejszy:let largest = ''; for (let item of arr) { if (item.length > largest.length) largest = item }
W IE możesz użyć
Array.forEach
; to wciąż szybsze i wyraźniejsze niż sortowanie lub zmniejszanie tablicy.var largest = ''; arr.forEach(function(item) { if (item.length > largest.length) largest = item });
źródło
To jest moje proste rozwiązanie
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])
źródło
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; }
źródło
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);
źródło