Вот мой код JavaScript:
var linkElement = document.getElementById("BackButton");
var loc_array = document.location.href.split('/');
var newT = document.createTextNode(unescape(capWords(loc_array[loc_array.length-2])));
linkElement.appendChild(newT);
В настоящее время он занимает от второго до последнего элемента в массиве из URL. Тем не менее, я хочу сделать проверку последнего элемента в массиве "index.html"
и, если это так, вместо этого взять третий элемент до последнего.
javascript
arrays
balexander
источник
источник
Не уверен, что есть недостаток, но это кажется довольно лаконичным:
или
Оба вернутся,
undefined
если массив пуст.источник
const [lastItem] = arr.slice(-1)
.pop()
удаляет последний элемент, который изменяет исходный массив. Это не то же самое, что просто получить это значение.Используйте Array.pop :
Важно : это возвращает последний элемент и удаляет его из массива
источник
Более короткая версия того, что написал @chaiguy:
Чтение индекса -1
undefined
уже возвращает .РЕДАКТИРОВАТЬ:
В наши дни предпочтение отдается использованию модулей, чтобы не касаться прототипа и не использовать глобальное пространство имен.
источник
var lastItem = [3,2,1,5].last();
. ЗначениеlastItem
это5
.Do NOT modify objects you Do NOT own
. Это опасно по многим причинам, таким как 1. Другие разработчики, работающие в вашей команде, могут запутаться, поскольку этот метод не является стандартным 2. При любом обновлении в библиотеках или даже при использовании более низкой или более высокой версии ECMAScript его легко можно потерять!Array.prototype
, но вы должны их использоватьObject.assign(Array.prototype, 'last', { value: function () { … } });
. В противном случае свойство будет перечисляемым.Два варианта:
или
Первый быстрее, но последний выглядит лучше
http://jsperf.com/slice-vs-length-1-arr
источник
Вот как получить его без эффекта на оригинальном массиве
Если вы используете pop (), он изменит ваш массив
Но вы можете использовать это, чтобы оно не влияло на исходный массив:
источник
pop()
Тогда в этом нет необходимости : просто сделайтеarr.slice(-1)[0]
Самый «чистый» путь ES6 (IMO) будет:
Это позволяет избежать мутаций
foo
, как.pop()
если бы мы не использовали оператор распространения.Тем не менее, мне нравится, а также
foo.slice(-1)[0]
решение.источник
.slice(-1)[0]
и медленнее..slice
Я бы лучше использовал,
array.pop()
чем индексы.таким образом, вы всегда получаете элемент, предшествующий index.html (при условии, что ваш массив содержит изолированный index.html как один элемент). Примечание: вы потеряете последние элементы из массива.
источник
Я думаю, если вы хотите получить элемент без удаления, проще использовать это:
Примечание. Если массив пуст (например,
[]
), он вернетсяundefined
.кстати ... я не проверял производительность, но я думаю, что проще написать и написать
источник
arr.slice(-1)[0] === arr[arr.length - 1]
), и b) оно медленное, потому что копируетarr
в новый массив (см. Stackoverflow.com/a/51763533/2733244 для измерения производительности).const [lastItem] = array.slice(-1);
Array.prototype.slice с -1 можно использовать для создания нового массива, содержащего только последний элемент исходного массива, затем вы можете использовать Destructuring Assignment для создания переменной с использованием первого элемента этого нового массива.
источник
Получить последний элемент массива можно с помощью среза метода с отрицательными значениями.
Вы можете прочитать больше об этом здесь внизу.
Использование pop () изменит ваш массив, что не всегда является хорошей идеей.
источник
arr.slice(-1)[0]
, как этот ответ .array[array.length - 1]
jsperf.com/get-last-item-from-array/13Вы можете использовать этот шаблон ...
В то время как он читает довольно хорошо, иметь в виду , что это создает новый массив , так что это менее эффективно , чем другие решения , но практически никогда не будет узким местом производительности приложения.
источник
Этот вопрос уже давно существует, поэтому я удивлен, что никто не упомянул о том, чтобы просто поставить последний элемент после a
pop()
.arr.pop()
так же эффективен, какarr[arr.length-1]
, и оба имеют ту же скорость, что иarr.push()
.Таким образом, вы можете сойти с рук:
--- отредактировано [проверьте, что
thePop
неundefined
до нажатия] ------ КОНЕЦ РЕДАКТИРОВАНИЯ ---
Который может быть уменьшен до этого (та же скорость [РЕДАКТИРОВАТЬ: но небезопасно!]):
Это в два раза медленнее
arr[arr.length-1]
, но вам не нужно разбираться с индексом. Это стоит золота в любой день.Из решений, которые я пробовал, и кратных единице времени выполнения (ETU)
arr[arr.length-1]
:[Метод] .............. [ETUs 5 elems] ... [ETUs 1 миллион elems]
Последние три варианта, ОСОБЕННО
[...arr].pop()
, становятся ОЧЕНЬ намного хуже, когда увеличивается размер массива. На машине без ограничений памяти моей машины,[...arr].pop()
вероятно, поддерживается что-то вроде соотношения 120: 1. Тем не менее, никто не любит ресурсного борова.источник
[]
будет преобразован в[undefined]
. Вам нужно защитить обратный толчок с помощью явнойundefined
проверки, что-то вродеmyPop !== undefined && arr.push(myPop)
Если кто-то хочет получить последний элемент за один раз, он / она может использовать
Array#splice()
:Здесь нет необходимости хранить разделенные элементы в массиве, а затем переходить к последнему элементу. Если получение последнего элемента является единственной целью, это следует использовать.
Примечание: это изменяет исходный массив , удаляя его последний элемент. Думайте
splice(-1,1)
какpop()
функция, которая выскакивает последний элемент.источник
["hi"]
против"hi"
.Для тех, кто не боится перегружать прототип Array (и с маскировкой перечисления вам не следует):
источник
JQuery решает это аккуратно:
источник
Я вообще использую underscorejs , с этим можно просто сделать
Для меня это более семантически, чем
loc_array.slice(-1)[0]
источник
Вот еще искусство Javascript, если вы пришли сюда в поисках
В духе другого ответа, который использовал
reduceRight()
, но короче:Он основан на том факте, что, если вы не предоставите начальное значение, самый последний элемент будет выбран в качестве исходного (см. Документацию здесь ). Поскольку обратный вызов просто продолжает возвращать начальное значение, последний элемент будет тем, который возвращается в конце.
Помните, что это следует рассматривать как искусство Javascript, и я ни в коем случае не рекомендую делать это, в основном потому, что он выполняется за время O (n), а также потому, что это ухудшает читабельность.
А теперь серьезный ответ
Лучший способ, который я вижу (учитывая, что вы хотите его более кратким, чем
array[array.length - 1]
), заключается в следующем:Тогда просто используйте функцию:
Функция на самом деле полезна в случае, если вы имеете дело с анонимным массивом, подобным
[3, 2, 1, 5]
используемому выше, в противном случае вам придется создавать его дважды, что было бы неэффективно и уродливо:Тьфу.
Например, вот ситуация, когда у вас есть анонимный массив и вам нужно определить переменную, но вы можете использовать
last()
вместо этого:источник
Просто поставлю еще один вариант здесь.
Я нашел вышеупомянутый подход более чистым и коротким. Пожалуйста, не стесняйтесь попробовать это.
Примечание: он изменит исходный массив, если вы не хотите изменять его, вы можете использовать
slice()
Спасибо @VinayPai за указание на это.
источник
Несколько способов найти последнее значение массива в JavaScript
источник
console.log(arr.reverse()[0])
- Поздравляем, вы только что изменили исходный массив.Это лучший вариант с точки зрения производительности (~ в 1000 раз быстрее, чем arr.slice (-1)).
источник
Лично я бы приветствовал ответ от kuporific / kritzikratzi. Метод array [array.length-1] становится очень уродливым, если вы работаете с вложенными массивами.
источник
В стадии предложения ECMAScript 1 предлагается добавить свойство массива, которое будет возвращать последний элемент: offer-array-last .
Синтаксис:
Вы можете использовать полифилл .
Автор предложения: Кит Циркель ( Chai Autor)
источник
Для предотвращения удаления последнего элемента из исходного массива вы можете использовать
В основном поддерживается всеми браузерами (ES6)
источник
Вы можете добавить
last()
функцию кArray
прототипу.источник
Все, что вы делаете, не просто использовать
reverse()
!!!В нескольких ответах упоминается,
reverse
но не упоминается тот факт, что онreverse
изменяет исходный массив и не (как в некоторых других языках или платформах) не возвращает копию.Это может быть худший тип кода для отладки!
источник
[...animals].reverse()
[1,3,4,5,"last"].slice().reverse()[0]
Уничтожение объектов ES6 - это еще один путь.
Вы извлекаете свойство длины из массива, используя деструктуризацию объекта. Вы создаете другой динамический ключ, используя уже извлеченный ключ с помощью [length-1], и назначаете его последнему , все в одной строке.
источник
Вы можете добавить новый метод получения свойства к прототипу,
Array
чтобы он был доступен через все экземплярыArray
.Получатели позволяют получить доступ к возвращаемому значению функции так же, как если бы это было значение свойства. Возвращаемое значение функции, конечно, является последним значением массива (
this[this.length - 1]
).Наконец, вы заключаете его в условие, которое проверяет,
last
является ли свойство -pro все ещеundefined
(не определено другим сценарием, который может полагаться на него).Не работает в IE ≤ 8.
источник
Array.prototype.last
это всегдаundefined
? If не работает под Chrome 36Отредактированный:
Недавно я придумал еще одно решение, которое сейчас мне кажется наилучшим для моих нужд:
С учетом приведенного выше определения я могу теперь сказать:
Название "W" означает «обертка». Вы можете увидеть, как вы можете легко добавить больше методов, кроме 'last ()' к этой оболочке.
Я говорю «лучше всего для моих нужд», потому что это позволяет мне легко добавлять другие такие «вспомогательные методы» к любому встроенному типу JavaScript. Например, на ум приходят car () и cdr () из Lisp.
источник
w
функцию, просто заставьте функцию вернуть последний элемент.w([1,2,3]).length
не определеноw([1,2,3])[1]
не определено Не похоже на обертку для меня. И есть синтаксическая ошибка. У вас есть дополнительный ';'. См. Stackoverflow.com/a/49725374/458321 о том, как написать оболочку класса (класс SutString) и использовать отражение для заполнения этой оболочки. Хотя, имхо, фантики излишни. Лучше использовать инкапсуляцию, как у вас почти есть.return { arr: anArray, last() { return anArray[anArray.length - 1]; } };
, Кроме того, w слишком общий. Вызов ArrayW или что-то.Я думаю, что самый простой и супер неэффективный способ:
источник