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?

JJJ
la source

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?"
Paolo Bergantino
la source
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();
Guffa
la source
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
mohawke
la source
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()
Smile4ever
la source
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é.

jithil
la source
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.

Tony
la source
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
la source
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

tnong
la source
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