Obtendo o último elemento de uma matriz de string dividida

183

Preciso obter o último elemento de uma matriz dividida com vários separadores. Os separadores são vírgulas e espaço. Se não houver separadores, ele retornará a string original.

Se a string for "como você está hoje?" deve retornar "hoje?"

Se a entrada foi "olá", a saída deve ser "olá".

Como posso fazer isso em JavaScript?

JJJ
fonte

Respostas:

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

Neste ponto, piecesé uma matriz e pieces.lengthcontém o tamanho da matriz, para obter o último elemento da matriz, verifique pieces[pieces.length-1]. Se não houver vírgulas ou espaços, ela simplesmente produzirá a string como foi fornecida.

alert(pieces[pieces.length-1]); // alerts "today?"
Paolo Bergantino
fonte
55
Você também pode usar pieces.pop()para obter o último item da sua matriz.
Trent
4
existe uma maneira de usar isso para se referir a str.split () sem precisar armazenar a variável?
Tanner #
1
var last = str.split(/[\s,]+/).pop()
zanderwar
788

Há uma linha para tudo. :)

var output = input.split(/[, ]+/).pop();
Guffa
fonte
6
O problema aqui é que pop () também remove esse elemento da matriz, alterando-o.
precisa saber é o seguinte
50
@ Jangla: Isso não é um problema, pois o array é criado pela splitchamada, não é mantido de qualquer maneira. A cadeia original não é alterada, exibindo o item da matriz.
Guffa
1
brilhante, todos de uma só vez, sem necessidade de var intermediário para configuração da matriz ... agradável
virtualeyes
@Guffa Você sabe como posso obter os dois últimos elementos do split?
Vitor Guerreiro
2
@ MarioLevrero: Esse é um quantificador que significa o mesmo que o quantificador {1,}, ou seja, [, ]+corresponde a um ou mais dos caracteres do conjunto (vírgula e espaço). É útil quando você deseja todas as palavras da string, mas quando você deseja apenas a última palavra, ela não faz nenhuma diferença funcional, apenas reduz a sobrecarga, pois haverá menos strings na matriz.
Guffa
56
var item = "one,two,three";
var lastItem = item.split(",").pop();
console.log(lastItem); // three
mohawke
fonte
10
Eu não acho que pop () aceite argumentos.
Graça Shao
5
Mas, genericamente falando, .split(',').pop()funciona para o último elemento em uma sequência separada por vírgula. Só estou dizendo que fui enganada pela resposta incrível de Guffa, simplesmente a ignorei porque não precisava de uma expressão regular e achei que o truque estava lá! : P
cregox
25

Você também pode considerar reverter sua matriz e pegar o primeiro elemento. Dessa forma, você não precisa saber sobre o tamanho, mas não traz benefícios reais e a desvantagem de que a operação reversa pode demorar mais com grandes matrizes:

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

É fácil, mas também modifica a matriz original em questão. Isso pode ou não ser um problema.

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

Provavelmente você pode querer usar isso:

array1.split(",").pop()
Smile4ever
fonte
1
O .pop()método é a melhor resposta que eu já vi até agora. Por isso foi criado!
Nicholas Porter
Eu recomendaria fortemente contra reverse () porque a reversão será cara em matrizes grandes. Se você não se importa com a mutação, basta usar pop (), caso contrário, fatia (-1) [0].
wortwart 07/04
13
array.split(' ').slice(-1)[0]

O melhor de sempre e o meu favorito.

jithil
fonte
Ah é claro. Esta é uma ótima resposta, pois não altera o +1 original
jhamPac
3

E se você não quiser construir uma matriz ...

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

O detalhamento em inglês é:

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

A substituição apenas substitui a cadeia inteira pelo material após o último separador.

Então você pode ver como isso pode ser aplicado em geral. Observe que a seqüência original não é modificada.

Tony
fonte
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 >>";
user7425063
fonte
0

Você pode acessar o índice da matriz diretamente:

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

tnong
fonte
3
Olá tnong, bem-vindo ao SO! Penso que esta resposta não leva em conta o separador de espaço, conforme solicitado na pergunta.
John-Philip
1
Essa resposta não suporta arbitrária comprimento matriz de cadeia
Nima Soroush