Obtenir le dernier élément d'un tableau de chaînes fractionnées


184

J'ai besoin d'obtenir le dernier élément d'un tableau divisé avec plusieurs séparateurs. Les séparateurs sont des virgules et des espaces. S'il n'y a pas de séparateurs, il doit renvoyer la chaîne d'origine.

Si la chaîne est "comment, allez-vous, aujourd'hui?" il devrait revenir "aujourd'hui?"

Si l'entrée était "bonjour", la sortie devrait être "bonjour".

Comment puis-je faire cela en JavaScript?

Réponses:


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

À ce stade, piecesest un tableau et pieces.lengthcontient la taille du tableau afin d'obtenir le dernier élément du tableau, vous vérifiez pieces[pieces.length-1]. S'il n'y a ni virgule ni espace, il affichera simplement la chaîne telle qu'elle a été donnée.

alert(pieces[pieces.length-1]); // alerts "today?"

55
Vous pouvez également utiliser pieces.pop()pour obtenir le dernier élément de votre tableau.
Trent

4
y a-t-il un moyen d'utiliser ceci pour renvoyer à str.split () sans avoir à stocker la variable?
Tanner

1
var last = str.split(/[\s,]+/).pop()
zanderwar

790

Il y a une seule ligne pour tout. :)

var output = input.split(/[, ]+/).pop();

6
Le problème ici est que pop () supprime également cet élément du tableau, le modifiant ainsi.
slashwwhat

50
@Jangla: Ce n'est pas un problème, car le tableau est créé par l' splitappel, il n'est de toute façon pas conservé. La chaîne d'origine n'est pas modifiée en faisant sauter l'élément du tableau.
Guffa

1
génial, tout en une seule fois, pas besoin de var intermédiaire pour configurer le tableau ... sympa
virtualeyes

@Guffa Savez-vous comment puis-je obtenir les deux derniers éléments de la séparation?
Vitor Guerreiro

2
@MarioLevrero: C'est un quantificateur qui signifie la même chose que le quantificateur {1,}, c'est-à-dire qui [, ]+correspond à un ou plusieurs des caractères de l'ensemble (virgule et espace). C'est utile lorsque vous voulez tous les mots de la chaîne, mais lorsque vous ne voulez que le dernier mot, cela ne fait aucune différence fonctionnelle, cela ne fait que réduire la surcharge car il y aura moins de chaînes dans le tableau.
Guffa

56
var item = "one,two,three";
var lastItem = item.split(",").pop();
console.log(lastItem); // three

10
Je ne pense pas que pop () prenne des arguments.
Grace Shao


5
Mais, de manière générique .split(',').pop() fonctionne pour le dernier élément sur une chaîne séparée par des virgules. Je dis juste parce que j'ai été induit en erreur par la réponse géniale de Guffa, je l'ai juste ignorée parce que je n'avais pas besoin d'une expression régulière et que je pensais que l'astuce était là! : P
cregox

25

Vous pouvez également envisager d'inverser votre tableau et de prendre le premier élément. De cette façon, vous n'avez pas besoin de connaître la longueur, mais cela n'apporte aucun avantage réel et l'inconvénient que l'opération inverse peut prendre plus de temps avec de gros tableaux:

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

C'est facile cependant, mais modifie également le tableau d'origine en question. Cela pourrait ou non être un problème.

Référence: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse

Vous voudrez probablement utiliser ceci cependant:

array1.split(",").pop()

1
La .pop()méthode est la meilleure réponse que j'ai vue jusqu'à présent. C'est pourquoi il a été créé!
Nicholas Porter le

Je déconseille fortement reverse () car l'inversion sera coûteuse sur les grands tableaux. Si vous ne vous souciez pas de la mutation, utilisez simplement pop (), sinon slice (-1) [0].
wortwart

13
array.split(' ').slice(-1)[0]

Le meilleur jamais et mon préféré.


Ah bien sûr. C'est une excellente réponse car elle ne mute pas le +1 original
jhamPac

3

Et si vous ne voulez pas construire de tableau ...

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

La ventilation en anglais est:

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

Le remplacement dit simplement de remplacer la chaîne entière par le truc après le dernier séparateur.

Vous pouvez donc voir comment cela peut être appliqué de manière générale. Notez que la chaîne d'origine n'est pas modifiée.


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

0

Vous pouvez accéder directement à l'index du tableau:

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


3
Bonjour tnong, bienvenue à SO! Je pense que cette réponse ne prend pas en compte le séparateur d'espace comme demandé dans la question.
John-Philip

1
Cette réponse ne prend pas en charge la longueur de tableau de chaînes arbitraire
Nima Soroush
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.