Отримання останнього елемента масиву розділених рядків


183

Мені потрібно отримати останній елемент розділеного масиву з декількома роздільниками. Роздільники - коми і простір. Якщо роздільників немає, він повинен повернути початковий рядок.

Якщо рядок "як, що ти робиш, сьогодні?" воно має повернутися "сьогодні?"

Якщо вхід був "привіт", вихід повинен бути "привіт".

Як я можу це зробити в JavaScript?

Відповіді:


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

На даний момент, piecesце масив і pieces.lengthмістить розмір масиву, щоб отримати останній елемент масиву, ви перевіряєте pieces[pieces.length-1]. Якщо немає коми або пробілів, він просто виведе рядок таким, яким він був заданий.

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

55
Ви також можете використовувати pieces.pop()останній елемент масиву.
Трент

4
чи є спосіб використовувати це для повернення до str.split () без збереження змінної?
Таннер

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

788

На все є одне вкладиш. :)

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

6
Проблема тут полягає в тому, що pop () також видаляє цей елемент з масиву, тим самим змінюючи його.
косою хоч

50
@Jangla: Це не проблема, оскільки масив створюється splitвикликом, він все одно не зберігається. Оригінальний рядок не змінюється, вискакуючи елемент з масиву.
Гуффа

1
блискуче, все за один раз, немає потреби в посередницькій варі для налаштування масиву ... приємно
virtualeyes

@Guffa Чи знаєте ви, як я можу отримати останні два елементи розколу?
Вітор Геррейро

2
@MarioLevrero: Це кількісний показник, який означає те саме, що і кількісний показник {1,}, тобто [, ]+відповідає одному або більше символів у наборі (кома та пробіл). Це корисно, коли ви хочете, щоб усі слова були з рядка, але коли ви хочете лише останнє слово, це не робить ніякої функціональної різниці, воно лише зменшує накладні витрати, оскільки в масиві буде менше рядків.
Гуффа

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

10
Я не думаю, що поп () бере аргументи.
Грейс Шао


5
Але, загалом кажучи, .split(',').pop()працює для останнього елемента в рядку, розділеному комами. Просто кажу, тому що мене введено в оману дивовижною відповіддю Гуффи, я просто проігнорував це, тому що не потребував регулярного виразу і подумав, що фокус є! : P
Крегокс

25

Ви також можете розглянути можливість змінити масив і взяти перший елемент. Таким чином, вам не потрібно знати про довжину, але це не приносить реальної користі та недоліку, що обертання може зайняти більше часу для великих масивів:

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

Це легко, але також змінює оригінальний масив, про який йдеться. Це може бути або не бути проблемою.

Довідка: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse

Можливо, ви хочете скористатися цим:

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

1
.pop()Метод є найкращою відповіддю я бачив до сих пір. Ось чому його і створили!
Ніколас Портер

Я б настійно не радив проти reverse (), оскільки реверсування буде дорогим для великих масивів. Якщо вас не хвилює мутація, просто використовуйте pop (), інакше фрагмент (-1) [0].
wortwart

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

Найкращий з моїх улюблених.


Ну звичайно. Це чудова відповідь, оскільки вона не мутує оригіналу +1
jhamPac

3

І якщо ви не хочете побудувати масив ...

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

Розбиття англійською мовою:

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

Заміна просто говорить, що замініть весь рядок на матеріал після останнього роздільника.

Тож ви можете бачити, як це можна застосовувати загалом. Зверніть увагу, що початковий рядок не змінено.


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

Ви можете отримати доступ до індексу масиву безпосередньо:

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


3
Привіт tnong, ласкаво просимо до SO! Я думаю, що ця відповідь не враховує роздільник пробілу, як це було запропоновано в питанні.
Джон-Філіп

1
Ця відповідь не підтримує довільну довжину масиву рядків
Німа Соруш
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.