Aqui está o meu código JavaScript até agora:
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);
Atualmente, leva o penúltimo item da matriz a partir do URL. No entanto, desejo verificar o último item da matriz "index.html"
e, em caso afirmativo, pegue o terceiro para o último item.
javascript
arrays
balexander
fonte
fonte
const [lastItem] = arr.slice(-1)
.pop()
remove o último elemento que modifica a matriz original. Não é o mesmo que simplesmente recuperar esse valor.Use Array.pop :
Importante : Isso retorna o último elemento e o remove da matriz
fonte
Uma versão mais curta do que o @chaiguy postou:
A leitura do índice -1
undefined
já retorna .EDITAR:
Atualmente, a preferência parece estar usando módulos e evitar tocar no protótipo ou usar um espaço para nome global.
fonte
var lastItem = [3,2,1,5].last();
. O valor delastItem
é5
.Do NOT modify objects you Do NOT own
. É perigoso por várias razões, como 1. Outros desenvolvedores que trabalham em sua equipe podem ficar confusos, pois esse método não é padrão 2. com qualquer atualização nas bibliotecas ou mesmo usando uma versão ECMAScript mais baixa ou mais alta, ela pode facilmente ser PERDIDA!Array.prototype
, mas você deve usarObject.assign(Array.prototype, 'last', { value: function () { … } });
. Caso contrário, a propriedade será enumerável.Duas opções são:
ou
O primeiro é mais rápido, mas o último parece mais agradável
http://jsperf.com/slice-vs-length-1-arr
fonte
Veja como obtê-lo sem efeito no ARRAY original
Se você usar pop (), ele modificará sua matriz
Mas você pode usar isso para que não tenha efeito na matriz original:
fonte
pop()
, em seguida: basta fazêarr.slice(-1)[0]
A maneira ES6 "mais limpa" (IMO) seria:
Isso evita a mutação
foo
, como.pop()
teria acontecido, se não usássemos o operador de propagação.Dito isto, eu também gosto da
foo.slice(-1)[0]
solução.fonte
.slice(-1)[0]
mais lento. Pode bem usar.slice
Eu prefiro usar do
array.pop()
que índices.dessa forma, você sempre obtém o elemento anterior a index.html (desde que sua matriz tenha isolado index.html como um item). Nota: Você perderá os últimos elementos da matriz.
fonte
Eu acho que se você quiser apenas pegar o elemento sem remover, é mais simples usar isso:
Nota: Se a matriz estiver vazia (por exemplo
[]
), isso retornaráundefined
.a propósito ... eu não verifiquei o desempenho, mas acho que é mais simples e limpo de escrever
fonte
arr.slice(-1)[0] === arr[arr.length - 1]
) eb) é lento porque copiaarr
para uma nova matriz (consulte stackoverflow.com/a/51763533/2733244 para obter medições de desempenho).const [lastItem] = array.slice(-1);
Array.prototype.slice com -1 pode ser usado para criar uma nova matriz que contém apenas o último item da matriz original. Em seguida, você pode usar a Destructuring Assignment para criar uma variável usando o primeiro item dessa nova matriz.
fonte
É possível obter o último item de uma matriz usando o método de fatia com valores negativos.
Você pode ler mais sobre isso aqui na parte inferior.
Usar pop () mudará sua matriz, o que nem sempre é uma boa ideia.
fonte
arr.slice(-1)[0]
, use-a como esta resposta .array[array.length - 1]
jsperf.com/get-last-item-from-array/13Você pode usar esse padrão ...
Embora tenha uma boa leitura, lembre-se de criar uma nova matriz, por isso é menos eficiente do que outras soluções, mas quase nunca será o gargalo de desempenho do seu aplicativo.
fonte
Esta questão existe há muito tempo, por isso estou surpreso que ninguém tenha mencionado apenas colocar o último elemento novamente após a
pop()
.arr.pop()
é exatamente tão eficiente quantoarr[arr.length-1]
, e ambos têm a mesma velocidade quearr.push()
.Portanto, você pode se safar com:
--- EDITADO [cheque que
thePop
não éundefined
antes de empurrar] ------ END EDIT ---
O que pode ser reduzido para isso (a mesma velocidade [EDIT: mas insegura!]):
Isso é duas vezes mais lento que
arr[arr.length-1]
, mas você não precisa mexer em um índice. Isso vale ouro em qualquer dia.Das soluções que tentei e em múltiplos da Unidade de Tempo de Execução (ETU) de
arr[arr.length-1]
:[Método] .............. [ETUs 5 elems] ... [ETU 1 milhão de elems]
As últimas três opções, ESPECIALMENTE
[...arr].pop()
, ficam MUITO piores à medida que o tamanho da matriz aumenta. Em uma máquina sem as limitações de memória da minha máquina,[...arr].pop()
provavelmente mantém algo como a proporção de 120: 1. Ainda assim, ninguém gosta de recursos.fonte
[]
será transformada em[undefined]
. Você precisa proteger empurrar para trás com explícitaundefined
cheque, algo comomyPop !== undefined && arr.push(myPop)
Se alguém quiser obter o último elemento de uma só vez, ele / ela pode usar
Array#splice()
:Aqui, não há necessidade de armazenar os elementos divididos em uma matriz e, em seguida, chegar ao último elemento. Se conseguir o último elemento é o único objetivo, isso deve ser usado.
Nota: Isso altera a matriz original removendo seu último elemento. Pense
splice(-1,1)
como umapop()
função que exibe o último elemento.fonte
["hi"]
vs"hi"
.Para aqueles que não têm medo de sobrecarregar o protótipo Array (e com o mascaramento de enumeração, você não deveria estar):
fonte
O jQuery resolve isso perfeitamente:
fonte
Eu geralmente uso underscorejs , com ele você pode fazer
Para mim, isso é mais semântico do que
loc_array.slice(-1)[0]
fonte
Aqui está mais arte Javascript, se você veio procurá-la
No espírito de outra resposta que usou
reduceRight()
, mas mais curta:Ele se baseia no fato de que, caso você não forneça um valor inicial, o último elemento será selecionado como o inicial (verifique os documentos aqui ). Como o retorno de chamada continua retornando o valor inicial, o último elemento será o retornado no final.
Lembre-se de que isso deve ser considerado arte Javascript e não é o caminho que eu recomendaria, principalmente porque é executado em O (n) tempo, mas também porque prejudica a legibilidade.
E agora a resposta séria
A melhor maneira que vejo (considerando que você deseja que seja mais conciso do que
array[array.length - 1]
) é esta:Então basta usar a função:
A função é realmente útil no caso de você estar lidando com uma matriz anônima como a
[3, 2, 1, 5]
usada acima, caso contrário você teria que instanciar duas vezes, o que seria ineficiente e feio:Ugh.
Por exemplo, aqui está uma situação em que você tem uma matriz anônima e precisa definir uma variável, mas pode usar
last()
:fonte
Basta colocar outra opção aqui.
Achei a abordagem acima mais limpa e curta. Por favor, sinta-se livre para experimentar este.
Nota: Ele modificará a matriz original; se você não quiser modificá-la, poderá usar
slice()
Obrigado @VinayPai por apontar isso.
fonte
Várias maneiras de encontrar o último valor de uma matriz em javascript
fonte
console.log(arr.reverse()[0])
- parabéns, você acabou de modificar a matriz original.Essas são as melhores opções do ponto de vista do desempenho (~ 1000 vezes mais rápido que arr.slice (-1)).
fonte
Pessoalmente, eu gostaria de responder por kuporific / kritzikratzi. O método array [array.length-1] fica muito feio se você estiver trabalhando com matrizes aninhadas.
fonte
Na fase 1 da proposta do ECMAScript, há uma sugestão para adicionar uma propriedade de matriz que retornará o último elemento: proposição-matriz-última .
Sintaxe:
Você pode usar o polyfill .
Autor da proposta: Keith Cirkel ( chai autor)
fonte
Para impedir a remoção do último item da matriz de origem, você pode usar
Principalmente suportado por todos os navegadores (ES6)
fonte
Você pode adicionar uma
last()
função aoArray
protótipo.fonte
O que você fizer, não use apenas
reverse()
!!!Algumas respostas mencionam,
reverse
mas não mencionam, o fato de quereverse
modifica a matriz original e não (como em outra linguagem ou estrutura) retorna uma cópia.Este pode ser o pior tipo de código para depuração!
fonte
[...animals].reverse()
[1,3,4,5,"last"].slice().reverse()[0]
A desestruturação do objeto ES6 é outro caminho a percorrer.
Você extrai a propriedade length da matriz usando a destruição do objeto. Você cria outra chave dinâmica usando a chave já extraída por [length-1] e atribui-a ao último , tudo em uma linha.
fonte
Você pode adicionar um novo getter de propriedade ao protótipo de
Array
para que ele seja acessível em todas as instâncias deArray
.Os getters permitem acessar o valor de retorno de uma função como se fosse o valor de uma propriedade. O valor de retorno da função, é claro, é o último valor da matriz (
this[this.length - 1]
).Por fim, envolva-o em uma condição que verifica se a
last
propriedade-ainda estáundefined
(não definida por outro script que possa confiar nela).Não funciona no IE ≤ 8.
fonte
Array.prototype.last
é sempreundefined
? O if não está funcionando no Chrome 36EDITADO:
Recentemente, eu vim com mais uma solução que agora acho que é a melhor para minhas necessidades:
Com a definição acima em vigor, agora posso dizer:
O nome "w" significa "invólucro". Você pode ver como você pode facilmente adicionar mais métodos além de 'last ()' a esse wrapper.
Eu digo "melhor para minhas necessidades", porque isso permite que eu adicione facilmente outros "métodos auxiliares" a qualquer tipo interno de JavaScript. O que vem à mente são o carro () e o cdr () do Lisp, por exemplo.
fonte
w
função, faça com que ela retorne o último item.w([1,2,3]).length
está indefinido.w([1,2,3])[1]
está indefinido. Não parece um invólucro para mim. E há um erro de sintaxe. Você tem um ';' extra. Consulte stackoverflow.com/a/49725374/458321 para saber como escrever um wrapper de classe (classe SutString) e usar a reflexão para preencher esse wrapper. Embora, imho, os invólucros sejam um exagero. Melhor usar o encapsulamento, como você quase tem.return { arr: anArray, last() { return anArray[anArray.length - 1]; } };
. Além disso, w é muito genérico. A chamada é ArrayW ou algo assim.Eu acho que a maneira mais fácil e super ineficiente é:
fonte