Uzyskiwanie ostatniego elementu podzielonej tablicy ciągów


183

Muszę uzyskać ostatni element podzielonej tablicy z wieloma separatorami. Separatory to przecinki i spacja. Jeśli nie ma separatorów, powinien zwrócić oryginalny ciąg.

Jeśli ciąg brzmi „jak się masz, dzisiaj?” powinien zwrócić „dzisiaj?”

Jeśli dane wejściowe to „hello”, dane wyjściowe powinny być „hello”.

Jak mogę to zrobić w JavaScript?

Odpowiedzi:


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

W tym momencie piecesjest tablica i pieces.lengthzawiera rozmiar tablicy, więc aby uzyskać ostatni element tablicy, zaznaczasz pieces[pieces.length-1]. Jeśli nie ma przecinków ani spacji, po prostu wyświetli napis w takiej postaci, w jakiej został podany.

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

55
Możesz także użyć, pieces.pop()aby uzyskać ostatni element tablicy.
Trent,

4
czy istnieje sposób, aby użyć tego do odwołania do str.split () bez konieczności przechowywania zmiennej?
Tanner

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

788

Na wszystko jest jedna linijka. :)

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

6
Problem polega na tym, że pop () usuwa również ten element z tablicy, zmieniając go.
slashwhither

50
@Jangla: To nie jest problem, ponieważ tablica jest tworzona przez splitwywołanie, i tak nie jest zachowywana. Oryginalny ciąg nie jest zmieniany przez usunięcie elementu z tablicy.
Guffa

1
genialny, wszystko za jednym razem, nie trzeba pośredniego var do ustawienia tablicy ... ładne
virtualeyes

@Guffa Czy wiesz, jak mogę uzyskać dwa ostatnie elementy podziału?
Vitor Guerreiro

2
@MarioLevrero: To kwantyfikator, który oznacza to samo co kwantyfikator {1,}, tzn. [, ]+Dopasowuje jeden lub więcej znaków w zestawie (przecinek i spacja). Jest to przydatne, gdy chcesz wszystkie słowa z ciągu, ale gdy chcesz tylko ostatnie słowo, nie robi to żadnej funkcjonalnej różnicy, zmniejsza jedynie obciążenie, ponieważ w tablicy będzie mniej ciągów.
Guffa,

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

10
Nie sądzę, aby pop () pobierał argumenty.
Grace Shao,


5
Ale ogólnie rzecz biorąc .split(',').pop()działa dla ostatniego elementu na łańcuch oddzielony przecinkami. Tylko mówię, bo wprowadziła mnie w błąd niesamowita odpowiedź Guffy, po prostu zignorowałem ją, ponieważ nie potrzebowałem wyrażenia regularnego i myślałem, że sztuczka już tam jest! : P
cregox

25

Możesz także rozważyć odwrócenie tablicy i zabranie pierwszego elementu. W ten sposób nie musisz wiedzieć o długości, ale nie przynosi to żadnych realnych korzyści i wadę, że operacja odwrotna może potrwać dłużej przy dużych tablicach:

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

Jest to łatwe, ale modyfikuje również oryginalną tablicę. To może, ale nie musi stanowić problemu.

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

Prawdopodobnie możesz chcieć tego użyć:

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

1
Ta .pop()metoda jest najlepszą odpowiedzią, jaką do tej pory widziałem. Właśnie dlatego został stworzony!
Nicholas Porter

Zdecydowanie odradzam reverse (), ponieważ odwracanie będzie kosztowne w przypadku dużych tablic. Jeśli nie obchodzi Cię mutacja, po prostu użyj pop (), w przeciwnym razie slice (-1) [0].
wortwart

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

Najlepszy w historii i mój ulubiony.


Ach, oczywiście. To świetna odpowiedź, ponieważ nie
mutuje

3

A jeśli nie chcesz konstruować tablicy ...

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

Podział w języku angielskim to:

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

Zamień tylko mówi, że zamień cały ciąg znaków na rzeczy po ostatnim separatorze.

Możesz więc zobaczyć, jak można to ogólnie zastosować. Uwaga: oryginalny ciąg nie jest modyfikowany.


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

Możesz uzyskać dostęp do indeksu tablicy bezpośrednio:

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


3
Witaj tnong, witaj w SO! Myślę, że ta odpowiedź nie uwzględnia separatora spacji, zgodnie z żądaniem w pytaniu.
John-Philip

1
Ta odpowiedź nie obsługuje dowolnej długości tablicy łańcuchów
Nima Soroush
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.