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

184

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

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

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

Как я могу сделать это в JavaScript?

JJJ
источник

Ответы:

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();
Guffa
источник
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
Mohawke
источник
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()
Smile4ever
источник
1
Этот .pop()метод - лучший ответ, который я когда-либо видел. Вот почему это было создано!
Николас Портер
Я бы настоятельно рекомендовал не использовать reverse (), потому что реверсирование будет дорого для больших массивов. Если вас не волнует мутация, просто используйте pop (), иначе slice (-1) [0].
Ворсварт
13
array.split(' ').slice(-1)[0]

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

jithil
источник
Ну конечно. Это отличный ответ, потому что он не
изменяет
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 >>";
user7425063
источник
0

Вы можете получить доступ к индексу массива напрямую:

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

tnong
источник
3
Привет tnong, добро пожаловать в ТАК! Я думаю, что этот ответ не учитывает разделитель пробела, как того требует вопрос.
Джон-Филипп
1
Этот ответ не поддерживает произвольную длину массива строк
Nima Soroush