Obtener el último elemento de una matriz de cadenas divididas

183

Necesito obtener el último elemento de una matriz dividida con múltiples separadores. Los separadores son comas y espacios. Si no hay separadores, debería devolver la cadena original.

Si la cadena es "¿cómo estás hoy?" debería volver "hoy?"

Si la entrada fuera "hola", la salida debería ser "hola".

¿Cómo puedo hacer esto en JavaScript?

JJJ
fuente

Respuestas:

122
var str = "hello,how,are,you,today?";
var pieces = str.split(/[\s,]+/);

En este punto, pieceses una matriz y pieces.lengthcontiene el tamaño de la matriz, así que para obtener el último elemento de la matriz, verifica pieces[pieces.length-1]. Si no hay comas o espacios, simplemente generará la cadena como se le dio.

alert(pieces[pieces.length-1]); // alerts "today?"
Paolo Bergantino
fuente
55
También puede usar pieces.pop()para obtener el último elemento de su matriz.
Trent
44
¿Hay alguna manera de usar esto para referirse de nuevo a str.split () sin tener que almacenar la variable?
Tanner
1
var last = str.split(/[\s,]+/).pop()
zanderwar
788

Hay una línea para todo. :)

var output = input.split(/[, ]+/).pop();
Guffa
fuente
66
El problema aquí es que pop () también elimina ese elemento de la matriz, lo que lo cambia.
slashwhatever
50
@Jangla: Eso no es un problema, ya que la matriz es creada por la splitllamada, de todos modos no se mantiene. La cadena original no se cambia haciendo estallar el elemento de la matriz.
Guffa
1
genial, todo de una vez, sin necesidad de var intermediario para configurar la matriz ... agradable
virtualeyes
@Guffa ¿Sabes cómo puedo obtener los últimos dos elementos de división?
Vitor Guerreiro
2
@ MarioLevrero: Es un cuantificador que significa lo mismo que el cuantificador {1,}, es decir, [, ]+coincide con uno o más de los caracteres del conjunto (coma y espacio). Es útil cuando quiere todas las palabras de la cadena, pero cuando solo quiere la última palabra, no hace ninguna diferencia funcional, solo reduce la sobrecarga, ya que habrá menos cadenas en la matriz.
Guffa
56
var item = "one,two,three";
var lastItem = item.split(",").pop();
console.log(lastItem); // three
mohawke
fuente
10
No creo que pop () tome argumentos.
Grace Shao
55
Pero, genéricamente hablando, .split(',').pop()funciona para el último elemento en una cadena separada por comas. Solo digo que me engañó la asombrosa respuesta de Guffa, ¡simplemente la ignoré porque no necesitaba una expresión regular y pensé que el truco estaba allí! : P
cregox
25

También puede considerar invertir su matriz y tomar el primer elemento. De esa manera, no tiene que saber acerca de la longitud, pero no aporta beneficios reales y la desventaja de que la operación inversa puede llevar más tiempo con matrices grandes:

array1.split(",").reverse()[0]

Sin embargo, es fácil, pero también modifica la matriz original en cuestión. Eso podría o no ser un problema.

Referencia: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse

Sin embargo, probablemente quieras usar esto:

array1.split(",").pop()
Smile4ever
fuente
1
El .pop()método es la mejor respuesta que he visto hasta ahora. ¡Por eso fue creado!
Nicholas Porter
Recomiendo encarecidamente no reverse () porque la inversión será costosa en matrices grandes. Si no le importa la mutación, simplemente use pop (), de lo contrario, corte (-1) [0].
wortwart
13
array.split(' ').slice(-1)[0]

El mejor de todos y mi favorito.

jithil
fuente
Ah por supuesto. Esta es una gran respuesta porque no muta el +1 original
jhamPac
3

Y si no quieres construir una matriz ...

var str = "how,are you doing, today?";
var res = str.replace(/(.*)([, ])([^, ]*$)/,"$3");

El desglose en inglés es:

/(anything)(any separator once)(anything that isn't a separator 0 or more times)/

El reemplazo solo dice reemplazar toda la cadena con las cosas después del último separador.

Entonces puede ver cómo esto se puede aplicar en general. Tenga en cuenta que la cadena original no se modifica.

Tony
fuente
0
var title = 'fdfdsg dsgdfh dgdh dsgdh tyu hjuk yjuk uyk hjg fhjg hjj tytutdfsf sdgsdg dsfsdgvf dfgfdhdn dfgilkj,n, jhk jsu wheiu sjldsf dfdsf hfdkdjf dfhdfkd hsfd ,dsfk dfjdf ,yier djsgyi kds';
var shortText = $.trim(title).substring(1000, 150).split(" ").slice(0, -1).join(" ") + "...More >>";
usuario7425063
fuente
0

Puede acceder al índice de matriz directamente:

var csv = 'zero,one,two,three'; csv.split(',')[0]; //result: zero csv.split(',')[3]; //result: three

tnong
fuente
3
Hola tnong, bienvenido a SO! Creo que esta respuesta no tiene en cuenta el separador de espacio como se solicitó en la pregunta.
John-Philip
1
Esta respuesta no es compatible con la longitud de la matriz de cadenas arbitraria
Nima Soroush