Encontrar la cadena más larga en la matriz


84

¿Existe una forma corta de encontrar la cadena más larga en una matriz de cadenas?

Algo como arr.Max(x => x.Length);?

Respuestas:


194

Disponible desde Javascript 1.8 / ECMAScript 5 y disponible en la mayoría de los navegadores antiguos :

var longest = arr.reduce(
    function (a, b) {
        return a.length > b.length ? a : b;
    }
);

De lo contrario, una alternativa segura:

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

¿Qué pasa si hay 2 o más cadenas del mismo tamaño y el resultado debería ser una matriz? reducir no funcionará en ese caso y debe iterar en el primer resultado.
Gismo Ranas

@GismoRanas Esa es una pregunta diferente, y aún podría usarla reducecon una función de devolución de llamada que devuelva una matriz.
diciembre

34

Una nueva respuesta a una vieja pregunta: en ES6 puedes hacerlo más corto:

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

7
Esto devuelve la longitud de la cadena más larga, no la cadena más larga.
Mikemike

Otra cosa a tener en cuenta es que esto atravesará la colección dos veces siendo O(n^2)donde la mayoría de las otras opciones solo atravesarán la colección una vez O(n). Los comparadores personalizados sortpueden incluso serO(log(n))
CTS_AE

27

Yo haría algo como esto

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
Este es el mejor ya que no afecta su matriz. Mientras que si ordena (como en la respuesta elegida) su matriz se ordena, cuando a veces no quiere eso. +1, gracias
thatOneGuy

4
var arr = [ 'fdgdfgdfg', 'gdfgf', 'gdfgdfhawsdgd', 'gdf', 'gdfhdfhjurvweadsd' ];
arr.sort(function (a, b) { return b.length - a.length })[0];

4

Usando Array.prototype - (sort es similar a lo que fue publicado por @katsPaugh y @deceze mientras estaba haciendo un violín)

DEMO AQUÍ

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

Proporciono un enfoque funcional + recursivo. Vea los comentarios para comprender cómo funciona:

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)


¿Alguna idea de por qué esto no me funciona? const longestRec = longestWord => ([nextWord, ... palabras]) => ^ TypeError: undefined no es una función
duque

@duke Voy a echar un vistazo, pero supongo que hay detrás del problema.
Matías Fidemraizer

@duke Por cierto, ¿puedes darme la entrada? ¿Estás usando el código tal cual ?
Matías Fidemraizer

vea abajo. pero aparentemente ni siquiera se compila. pero tienes razón: usar solo tu código funciona bien ... deja obj = {"HostName": {"Generated": "@logon", "Value": "openPI", "LastRun": "2018-11- 15 07: 57: 50,186 "}," HostIp ": {" Generado ":" @cron "," Valor ":" 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"}};
duque

lo siento por molestarte, pensé que no se compilaba. No tengo una matriz.
duque

3

Veo la solucion mas corta

function findLong(s){
  return Math.max.apply(null, s.split(' ').map(w => w.length));
}

1
Prefiero ese, aunque puede que no sea el más rápido
guhur

1
esto da extensión pero no la palabra
brk

3

Quizás no sea el más rápido, pero ciertamente bastante legible:

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"

La función de matriz para cada uno se admite desde IE9 + .


3

En ES6, esto se podría lograr con una reduce()llamada en O(n)complejidad en lugar de las soluciones sort()que utilizan 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
Espero que más personas se desplacen hasta aquí, porque esta debería ser la respuesta aceptada. Si por alguna razón necesita la sintaxis de ES5 y no puede usar la función de flecha arr.reduce(function(savedText, text) { return text.length > savedText.length ? text : savedText; }, '');
gruesa

2

Me inspiré en la función de Jason e hice algunas mejoras y obtuve como resultado un buscador bastante rápido:

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

Resultados de velocidad: http://jsperf.com/longest-string-in-array/7


1

Haré algo como esto:

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

Si su cadena ya está dividida en una matriz, no necesitará la parte dividida.

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

En caso de que espere más de un máximo, esto funcionará:

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

Utiliza lodash y devuelve una matriz.


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

puede ser trabajo


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

¿Agrega esto algo a la ya extensa lista de respuestas existentes? No.
luk2302

0

Con ES6 compatible, también cadena duplicada

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

Esta es mi sencilla solución

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
Si bien este código puede resolver el problema del OP, es mejor incluir una explicación de cómo su código aborda el problema del OP. De esta manera, los futuros visitantes pueden aprender de su publicación y aplicarla a su propio código. SO no es un servicio de codificación, sino un recurso de conocimiento. Además, es más probable que se voten a favor las respuestas completas y de alta calidad. Estas características, junto con el requisito de que todas las publicaciones sean independientes, son algunas de las fortalezas de SO como plataforma, que la diferencia de los foros. Puede editar para agregar información adicional y / o complementar sus explicaciones con la documentación original.
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);

o una forma más limpia usando la función Arrow: var findLongestWord = function (array) {var longgest = array.reduce ((a, b) => {return (a.length> b.length)? a: b;}); retorno más largo; }
Ash Khan
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.