Получение последнего элемента массива разделенных строк


184

Мне нужно получить последний элемент разделенного массива с несколькими разделителями. Разделителями являются запятые и пробел. Если разделителей нет, он должен вернуть исходную строку.

Если строка "как дела, сегодня?" должно вернуться "сегодня?"

Если вход был "привет", выход должен быть "привет".

Как я могу сделать это в 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()
Зандервар

790

Есть один вкладыш для всего. :)

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

6
Проблема здесь в том, что pop () также удаляет этот элемент из массива, тем самым изменяя его.
косая черта

50
@Jangla: Это не проблема, так как массив создается splitвызовом, он все равно не сохраняется. Исходная строка не изменяется при извлечении элемента из массива.
Гуффа

1
великолепно, все за один раз, нет необходимости в промежуточном var для настройки массива ... приятно
virtualeyes

@ Гуффа Знаете ли вы, как я могу получить последние два элемента раскола?
Витор Геррейро

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

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

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


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

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 (), иначе slice (-1) [0].
Ворсварт

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

Самый лучший и мой любимый.


Ну конечно. Это отличный ответ, потому что он не
изменяет

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, добро пожаловать в ТАК! Я думаю, что этот ответ не учитывает разделитель пробела, как того требует вопрос.
Джон-Филипп

1
Этот ответ не поддерживает произвольную длину массива строк
Nima Soroush
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.