배열에서 가장 긴 문자열 찾기


84

string 형 배열에서 가장 긴 문자열을 찾는 짧은 방법이 있습니까?

같은 뭔가 arr.Max(x => x.Length);?

답변:


194

사용 가능한부터 자바 스크립트 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가 작동하지 않으며 첫 번째 결과를 반복해야합니다.
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 : undefined는 함수가 아닙니다
duke

@duke 내가 살펴 보 겠지만 문제의 원인이 무엇인지 추측합니다.
Matías Fidemraizer 2018

@duke BTW, 입력 해 주 시겠어요? 코드를있는 그대로 사용하고 있습니까?
Matías Fidemraizer

아래를 참조하십시오. 그러나 그것은 겉보기에 컴파일되지도 않습니다. 하지만 당신이 옳습니다 : 코드 만 사용하면 잘 작동합니다 .... 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"}};
duke

귀찮게해서 미안합니다. 컴파일이 안된 줄 알았어요. 나는 배열이 없습니다.
duke

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"

forEach 배열 함수 는 IE9 + 이후 지원되었습니다 .


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

저는 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

최신 브라우저는 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.