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

Neir0
fuente

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];
deceze
fuente
¿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)));
Dávid Veszelovszki
fuente
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);

Jason Gennaro
fuente
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];
katspaugh
fuente
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());    
mplungjan
fuente
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)

Matías Fidemraizer
fuente
¿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));
}
Giancarlo Ventura
fuente
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 + .

Niels van Reijmersdal
fuente
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']))

Alex Lomia
fuente
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

Timo Kähkönen
fuente
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");
Siawash Kasra
fuente
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");
Andy Smith
fuente
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.

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

puede ser trabajo

Jack Chen
fuente
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
fuente
¿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))
Taha Azzabi
fuente
0

Los navegadores modernos admiten un for...ofbucle. La forma más rápida y corta de resolver este problema en Chrome, Safari, Edge y Firefox también es la más clara:

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

En IE, puede usarArray.forEach ; eso es aún más rápido y claro que ordenar o reducir la matriz.

var largest = '';
arr.forEach(function(item) {
  if (item.length > largest.length) largest = item
});
Dan Fabulich
fuente
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])
Alex Irabor
fuente
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
fuente
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);
Ash Khan
fuente
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