Aquí está mi código JavaScript hasta ahora:
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);
Actualmente, toma el penúltimo elemento de la matriz desde la URL. Sin embargo, quiero hacer una comprobación del último elemento de la matriz "index.html"
y, de ser así, tomar el tercer al último elemento.
javascript
arrays
balexander
fuente
fuente
No estoy seguro si hay un inconveniente, pero esto parece bastante conciso:
o
Ambos volverán
undefined
si la matriz está vacía.fuente
const [lastItem] = arr.slice(-1)
.pop()
elimina el último elemento que modifica la matriz original. No es lo mismo que simplemente recuperar ese valor.Utilice Array.pop :
Importante : Esto devuelve el último elemento y lo elimina de la matriz.
fuente
Una versión más corta de lo que publicó @chaiguy:
Leer el índice -1
undefined
ya regresa .EDITAR:
En estos días, la preferencia parece ser el uso de módulos y evitar tocar el prototipo o usar un espacio de nombres global.
fuente
var lastItem = [3,2,1,5].last();
. El valor delastItem
es5
.Do NOT modify objects you Do NOT own
. Es peligroso por muchas razones, como 1. Otros desarrolladores que trabajan en su equipo podrían confundirse ya que este método no es estándar 2. Con cualquier actualización en las bibliotecas o incluso utilizando una versión ECMAScript inferior o superior, ¡podría PERDERse fácilmente!Array.prototype
, pero debes usarloObject.assign(Array.prototype, 'last', { value: function () { … } });
. De lo contrario, la propiedad será enumerable.Dos opciones son:
o
El primero es más rápido, pero el segundo se ve mejor
http://jsperf.com/slice-vs-length-1-arr
fuente
Aquí le mostramos cómo obtenerlo sin efecto en el ARRAY original
Si usa pop (), modificará su matriz
Pero puede usar esto para que no tenga efecto en la matriz original:
fuente
pop()
Entonces no hay necesidad de eso : solo hazloarr.slice(-1)[0]
La forma más limpia de ES6 (IMO) sería:
Esto evita la mutación
foo
, como lo.pop()
habría hecho, si no utilizáramos el operador de propagación.Dicho esto, también me gusta la
foo.slice(-1)[0]
solución.fuente
.slice(-1)[0]
pero es más lento. También podría usarlo.slice
Prefiero usar
array.pop()
que los índices.de esta manera siempre obtienes el elemento anterior a index.html (siempre que tu matriz tenga index.html aislado como un elemento). Nota: Sin embargo, perderá los últimos elementos de la matriz.
fuente
Creo que si solo quieres obtener el elemento sin eliminar, es más simple usar esto:
Nota: Si la matriz está vacía (por ejemplo
[]
), esto regresaráundefined
.por cierto ... no verifiqué el rendimiento, pero creo que es más simple y limpio de escribir
fuente
arr.slice(-1)[0] === arr[arr.length - 1]
), yb) es lento porque se copiaarr
en una nueva matriz (consulte stackoverflow.com/a/51763533/2733244 para medir el rendimiento).const [lastItem] = array.slice(-1);
Array.prototype.slice con -1 se puede usar para crear una nueva matriz que contenga solo el último elemento de la matriz original, luego puede usar la asignación de desestructuración para crear una variable usando el primer elemento de esa nueva matriz.
fuente
Se puede obtener el último elemento de una matriz utilizando el método de división con valores negativos.
Puedes leer más sobre esto aquí en la parte inferior.
El uso de pop () cambiará su matriz, lo que no siempre es una buena idea.
fuente
arr.slice(-1)[0]
, como esta respuesta .array[array.length - 1]
jsperf.com/get-last-item-from-array/13Puedes usar este patrón ...
Si bien se lee bastante bien, tenga en cuenta que crea una nueva matriz, por lo que es menos eficiente que otras soluciones, pero casi nunca será el cuello de botella de rendimiento de su aplicación.
fuente
Esta pregunta ha existido desde hace mucho tiempo, por lo que me sorprende que nadie haya mencionado volver a poner el último elemento después de un
pop()
.arr.pop()
es exactamente tan eficiente comoarr[arr.length-1]
, y ambos tienen la misma velocidad quearr.push()
.Por lo tanto, puede salirse con la suya:
--- EDITADO [comprobar que
thePop
no esundefined
antes de presionar] ------ EDICIÓN FINAL ---
Que se puede reducir a esto (misma velocidad [EDITAR: ¡pero inseguro!]):
Esto es dos veces más lento que
arr[arr.length-1]
, pero no tiene que andar con un índice. Eso vale oro en cualquier día.De las soluciones que he probado, y en múltiplos de la Unidad de Tiempo de Ejecución (ETU) de
arr[arr.length-1]
:[Método] .............. [ETUs 5 elems] ... [ETU 1 millón de elems]
Las últimas tres opciones, ESPECIALMENTE
[...arr].pop()
, empeoran MUCHO a medida que aumenta el tamaño de la matriz. En una máquina sin las limitaciones de memoria de mi máquina,[...arr].pop()
probablemente mantiene algo así como su relación 120: 1. Aún así, a nadie le gusta un recurso cerdo.fuente
[]
se convertirá en[undefined]
.undefined
myPop !== undefined && arr.push(myPop)
Si uno quiere obtener el último elemento de una vez, puede usar
Array#splice()
:Aquí, no hay necesidad de almacenar los elementos divididos en una matriz, y luego llegar al último elemento. Si obtener el último elemento es el único objetivo, se debe usar.
Nota: Esto cambia la matriz original al eliminar su último elemento. Piense
splice(-1,1)
como unapop()
función que muestra el último elemento.fuente
["hi"]
vs"hi"
.Para aquellos que no temen sobrecargar el prototipo de Array (y con el enmascaramiento de enumeración no deberían estarlo):
fuente
jQuery resuelve esto perfectamente:
fuente
Generalmente uso subrayado , con él puedes hacer
Para mí eso es más semántico que
loc_array.slice(-1)[0]
fuente
Aquí hay más arte Javascript si viniste a buscarlo
En el espíritu de otra respuesta que usó
reduceRight()
, pero más corta:Se basa en el hecho de que, en caso de que no proporcione un valor inicial, el último elemento se selecciona como el inicial (consulte los documentos aquí ). Como la devolución de llamada sigue devolviendo el valor inicial, el último elemento será el que se devuelve al final.
Tenga en cuenta que esto debería considerarse arte Javascript y de ninguna manera recomendaría hacerlo, principalmente porque se ejecuta en tiempo O (n), pero también porque perjudica la legibilidad.
Y ahora por la respuesta seria
La mejor manera que veo (considerando que lo quieres más conciso que
array[array.length - 1]
) es esto:Entonces solo use la función:
La función es realmente útil en caso de que se trate de una matriz anónima como la
[3, 2, 1, 5]
utilizada anteriormente, de lo contrario, tendría que instanciarla dos veces, lo que sería ineficiente y feo:Ugh
Por ejemplo, aquí hay una situación en la que tiene una matriz anónima y tendría que definir una variable, pero puede usar
last()
en su lugar:fuente
Solo pongo otra opción aquí.
Encontré el enfoque anterior más limpio y corto en línea. Por favor, siéntase libre de probar este.
Nota: modificará la matriz original; si no desea modificarla, puede usar
slice()
Gracias @VinayPai por señalar esto.
fuente
Múltiples formas de encontrar el último valor de una matriz en javascript
fuente
console.log(arr.reverse()[0])
- felicidades, acaba de modificar la matriz original.Estas son las mejores opciones desde el punto de vista del rendimiento (~ 1000 veces más rápido que arr.slice (-1)).
fuente
Personalmente, votaría por kuporific / kritzikratzi. El método de matriz [array.length-1] se vuelve muy feo si está trabajando con matrices anidadas.
fuente
En la Etapa 1 de la propuesta ECMAScript hay una sugerencia para agregar una propiedad de matriz que devolverá el último elemento: offer-array-last .
Sintaxis:
Puedes usar polyfill .
Autor de la propuesta: Keith Cirkel ( autor chai )
fuente
Para evitar eliminar el último elemento de la matriz de origen, puede usar
Principalmente compatible con todos los navegadores (ES6)
fuente
Puede agregar una
last()
función alArray
prototipo.fuente
Hagas lo que hagas, ¡no lo uses
reverse()
!Algunas respuestas mencionan
reverse
pero no mencionan el hecho de quereverse
modifica la matriz original y no devuelve (como en otros lenguajes o marcos) una copia.¡Este puede ser el peor tipo de código para depurar!
fuente
[...animals].reverse()
[1,3,4,5,"last"].slice().reverse()[0]
La desestructuración de objetos ES6 es otro camino a seguir.
Extrae la propiedad de longitud de la matriz mediante la desestructuración de objetos. Puede crear otra clave dinámica utilizando la clave ya extraída por [longitud-1] y asignarla al último , todo en una línea.
fuente
Puede agregar un nuevo captador de propiedades al prototipo de
Array
modo que sea accesible a través de todas las instancias deArray
.Los captadores le permiten acceder al valor de retorno de una función como si fuera el valor de una propiedad. El valor de retorno de la función, por supuesto, es el último valor de la matriz (
this[this.length - 1]
).Finalmente lo envuelve en una condición que verifica si la
last
propiedad todavía estáundefined
(no definida por otro script que pueda depender de ella).No funciona en IE ≤ 8.
fuente
Array.prototype.last
es siempreundefined
? El if no funciona en Chrome 36EDITADO:
Recientemente se me ocurrió una solución más que ahora creo que es la mejor para mis necesidades:
Con la definición anterior en efecto, ahora puedo decir:
El nombre "w" significa "envoltorio". Puede ver cómo podría agregar fácilmente más métodos además de 'last ()' a este contenedor.
Digo "lo mejor para mis necesidades", porque esto me permite agregar fácilmente otros "métodos auxiliares" a cualquier tipo de JavaScript incorporado. Lo que viene a la mente son el auto () y el cdr () de Lisp, por ejemplo.
fuente
w
función, simplemente haga que la función devuelva el último elemento.w([1,2,3]).length
es indefinido.w([1,2,3])[1]
es indefinido. No me parece una envoltura. Y hay un error de sintaxis. Tienes un ';' extra. Consulte stackoverflow.com/a/49725374/458321 para saber cómo escribir un contenedor de clase (clase SutString) y usar la reflexión para llenar ese contenedor. Aunque, en mi humilde opinión, los envoltorios son excesivos. Es mejor usar encapsulación, como casi lo tienes.return { arr: anArray, last() { return anArray[anArray.length - 1]; } };
. Además, w es demasiado genérico. La llamada es ArrayW o algo así.Creo que la forma más fácil y súper ineficiente es:
fuente