Seleccionar o último elemento na lista de JavaScript [duplicado]
esta pergunta já tem uma resposta aqui:
- coloca o último item numa lista 34 respostas
estou a fazer uma aplicação que actualiza a localização e o caminho de um utilizador em tempo real e mostra isto num mapa do Google. Eu tenho funcionalidade que permite que vários usuários sejam rastreados ao mesmo tempo usando um objeto, que é atualizado cada segundo.
agora mesmo, quando um usuário pressiona um botão no aplicativo Android, as coordenadas são enviadas para um banco de dados e cada vez que a localização muda, um marcador é atualizado no mapa (e uma linha de política é formada).
Uma vez que tenho vários utilizadores, envio uma cadeia alfanumérica única e gerada aleatoriamente para poder mostrar um caminho individual para cada utilizador. Quando o JS puxa esses dados do banco de dados, ele verifica se o usuário existe, se não existe, ele cria uma nova chave com o valor ser uma lista. Seria parecido com isto.
loc = {f096012e-2497-485d-8adb-7ec0b9352c52: [new google.maps.LatLng(39, -86),
new google.maps.LatLng(38, -87),
new google.maps.LatLng(37, -88)],
44ed0662-1a9e-4c0e-9920-106258dcc3e7: [new google.maps.LatLng(40, -83),
new google.maps.LatLng(41, -82),
new google.maps.LatLng(42, -81)]}
o que estou a fazer é armazenar uma lista de coordenadas como o valor da chave, que é o ID do utilizador. Meu programa continua atualizando esta lista cada vez que a localização é alterada, adicionando à lista (isso funciona corretamente).
o que preciso de fazer é actualizar a localização do marcador cada vez que a localização muda. Eu gostaria de fazer isso selecionando o último item no array, uma vez que esse seria o último local conhecido. Neste momento, cada um quando a localização é alterada, um novo Marcador é adicionado ao mapa (cada um dos pontos do exemplo mostraria um marcador nesse local) para que os marcadores continuem a ser adicionados.
eu usaria uma declaração para (x in loc) de cada vez que as actualizações de localização fossem feitas para obter a última localização da lista e usá-la para actualizar o marcador. Como é que selecciono este último elemento da lista dentro do hash?
13 answers
Como aceder ao último elemento de um array
Parece que:
var my_array = /* some array here */;
var last_element = my_array[my_array.length - 1];
Que no seu caso se parece com isto:
var array1 = loc['f096012e-2497-485d-8adb-7ec0b9352c52'];
var last_element = array1[array1.length - 1];
Ou, numa versão mais longa, sem criar novas variáveis:
loc['f096012e-2497-485d-8adb-7ec0b9352c52'][loc['f096012e-2497-485d-8adb-7ec0b9352c52'].length - 1];
Como adicionar um método para torná-lo mais simples
Se é fã de criar funções/atalhos para cumprir essas tarefas, o seguinte código:
if (!Array.prototype.last){
Array.prototype.last = function(){
return this[this.length - 1];
};
};
Permitir-lhe-á obter o último elemento de um array invocando o método last()
do array, no seu caso exemplo.:
loc['f096012e-2497-485d-8adb-7ec0b9352c52'].last();
Pode verificar se funciona aqui. http://jsfiddle.net/D4NRN/
Utilizar o método slice()
:
my_array.slice(-1)[0]
Você também pode .pop
fora do último elemento. Tenha cuidado, isso vai mudar o valor da matriz {[[5]}, mas isso pode ser bom para você.
var a = [1,2,3];
a.pop(); // 3
a // [1,2]
var arr = [1, 2, 3];
arr.slice(-1).pop(); // return 3 and arr = [1, 2, 3]
Isto irá retornar indefinido se o array estiver vazio e isto não irá alterar o valor do array.
Utilizar o sistema de desconstrução es6 com o operador de spread
var last = [...yourArray].pop();
Repare que a sua raiva não muda.
var last = array.slice(-1)[0];
Eu acho a fatia em -1 útil para obter o último elemento (especialmente de uma matriz de comprimento desconhecido) e o desempenho é muito melhor do que calcular o comprimento menos 1.
Desempenho dos vários métodos para seleccionar o último elemento da lista
Sublinhado e O Lodash tem o método _.last(Array)
, que devolve o último elemento de uma lista. Ambos trabalham na mesma coisa.
_.last([5, 4, 3, 2, 1]);
=> 1
Ramda também tem uma função _.last
R.last(['fi', 'fo', 'fum']); //=> 'fum'
Use objetos JavaScript se isso for crítico para a sua aplicação. não deve usar primitivos crus para gerir partes críticas da sua aplicação. Como este parece ser o núcleo de sua aplicação, você deve usar objetos em vez disso. Escrevi um código abaixo para te ajudar a começar. O método lastLocation
devolveria a última localização.
function User(id) {
this.id = id;
this.locations = [];
this.getId = function() {
return this.id;
};
this.addLocation = function(latitude, longitude) {
this.locations[this.locations.length] = new google.maps.LatLng(latitude, longitude);
};
this.lastLocation = function() {
return this.locations[this.locations.length - 1];
};
this.removeLastLocation = function() {
return this.locations.pop();
};
}
function Users() {
this.users = {};
this.generateId = function() {
return Math.random();
};
this.createUser = function() {
var id = this.generateId();
this.users[id] = new User(id);
return this.users[id];
};
this.getUser = function(id) {
return this.users[id];
};
this.removeUser = function(id) {
var user = this.getUser(id);
delete this.users[id];
return user;
};
}
var users = new Users();
var user = users.createUser();
user.addLocation(0, 0);
user.addLocation(0, 1);
Você pode definir um getter on Array.prototype
:
if (!Array.prototype.hasOwnProperty("last")) {
Object.defineProperty(Array.prototype, "last", {
get: function() {
return this[this.length - 1];
}
});
}
console.log([9, 8, 7, 6].last); // => 6
Como pode ver, o access não se parece com uma chamada de função; a função getter é chamada internamente.
No caso de estar a utilizar ES6 pode fazer:
const arr = [ 1, 2, 3 ];
[ ...arr ].pop(); // 3
arr; // [ 1, 2, 3 ] (wasn't changed)
var last = function( obj, key ) {
var a = obj[key];
return a[a.length - 1];
};
last(loc, 'f096012e-2497-485d-8adb-7ec0b9352c52');
Funcionou:
array.reverse()[0]
var a = [1,2,3]
a.pop()
//3
//a is now [1,2]
Então, para um método muito tolo e não destrutivo ...
var a = [1,2,3]
a[a.push(a.pop())-1]
//3
Um empurrão, como nos anos 90:
O Push adiciona um valor ao fim de uma matriz, e devolve o comprimento do resultado. então
d=[]
d.push('life')
//=> 1
d
//=>['life']
O Pop devolve o valor do último item de uma lista, antes de remover esse valor nesse índice. então
c = [1,2,1]
c.pop()
//=> 1
c
//=> [1,2]
As matrizes são 0 indexada, c.comprimento => 3, c[c.duração] => indefinido (porque você está olhando para o 4º valor se que este nível de profundidade é para qualquer infeliz newbs que acabar aqui)).
Provavelmente não é o melhor, ou mesmo um bom método para a sua aplicação, com o trânsito, churn, blah. mas por percorrer uma matriz, enviá-la para outra, só sendo tolo com métodos ineficientes, isto. Totalmente isto.