получить предпоследний элемент массива?

Как я могу получить последний второй элемент в массиве?

например,

var fragment = '/news/article-1/'
var array_fragment = fragment.split('/');
var pg_url = $(array_fragment).last()[0];

Это возвращает пустое значение. Но я хочу получить article-1

спасибо.

8 ответов


Не все должно быть сделано с помощью jQuery.

в обычном старом javascript вы можете сделать:

var pg_url = array_fragment[array_fragment.length - 2]

легче и быстрее :)


Похоже, вы также можете использовать Javascript slice способ:

> path = 'a/b/c/d';
> path.split('/').slice(-2, -1)[0];
'c'

вы также можете думать о "от второго до последнего элемента в массиве" как "второй элемент массива наоборот":

> path = 'a/b/c/d';
> path.split('/').reverse()[1];
'c'

Шаг 1: Используйте split () метод разделения элементов на массив.

var fragment_arr = fragment.split("/");

Шаг 2: Используйте slice (-2) метод для выбора последнего 2 элемента из массива, отрицательное число для выбора из конца массива.

var lastTwo = fragment_arr.slice(-2);

Шаг 3: lastTwo массив содержит последние два элемента fragment_arr, теперь вы можете получить доступ к такой

var element = lastTwo[0];
alert(element);

короткий ответ: : вы можете объединить шаги 2 и 3, как показано ниже

var element = fragment_arr.slice(-2)[0];
alert(element);

var pg_url = array_fragment[array_fragment.length -2]

array_fragment не является переменной jquery, это простая старая переменная javascript, поэтому нет необходимости в $()


Если доступ к массивам в обратном направлении-это то, что часто требуется, а не только второй до последнего индекса, можно использовать простое расширение прототипа.

при расширении чего-то большого и используемого в качестве прототипа массива убедитесь, что вы не собираетесь влиять на любую другую часть его использования. Это делается, убедившись, что свойство не перечисляется так, что for in не задохнется нигде (некоторые люди и библиотеки используют for in для перебора матрицы.)

Object.defineProperty(Array.prototype, 'rev', {
  enumerable: false,
  value: function(index){
    return this[this.length - 1 - index];
  }
});

document.write([1,2,3,4,5,6].rev(1));

и теперь вы можете использовать индексирование на основе нуля в обратном порядке.


этот вопрос старый, но все еще актуален. Срез с длиной-1 является лучшим выбором, но в качестве альтернативы с подчеркиванием / lodash:

_.initial () получает все, кроме последнего

_.last () получает последнее

Так что вы могли бы сделать

_.last(_.initial([1,2,3,4])) 

или цепью:

_.chain([1,2,3,4])
 .initial()
 .last()
 .value();

что дает вам обратно 3.

или в исходном вопросе:

var fragment = '/news/article-1/'
var array_fragment = fragment.split('/');
var pg_url = _.chain(array_fragment).initial().last().value();

следующее работает для строки с nth' url ' частями.

var fragment = '/t/e/s/t/i/n/g/';
var fragment = '/t/';

если фрагмент имеет переменную длину, вам нужно решение, которое работает для различных размеров фрагмента.

var fragment = '/news/article-1/';
var array_fragment = fragment.split('/');

Сплит разделяет строку фрагмента, где она находит ' / ' s. Split принимает значение до и после символа split. В этом случае нет ничего до первого Слэша или после последнего Слэша. Пустые значения добавляются в array_fragment в первом и последнее время позиции.

jQuery
var pg_url = $(array_fragment)[$(array_fragment).length - 2];

javascript
var pg_url = array_fragment[array_fragment.length - 2];

как вы можете видеть, jQuery не требуется для этого решения.

Array_fragment.длина - 2 подсчитывает длину array_fragment и выбирает второй элемент из конца. Последнее значение - "" из-за Split ('/'), добавляющего пустое значение в конец массива array_fragment.

упрощенный и все вместе:

var f = '/t/e/s/t/i/n/g/'.split('/');
f[f.length - 2]

const myArray: Array<string> = ['first', 'second', 'third'];

разделить myArray на второй последний пункт.

const twoItemsFromEnd = myArray.slice(-2); //Outputs: ['second', 'third']

затем

const secondLast = twoItemsFromEnd[0];

или:

const secondLast = (params.slice(-2))[0];