Seleccionar o último elemento na lista de JavaScript [duplicado]

esta pergunta já tem uma resposta aqui:

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?

Author: Sebastian Zartner, 2012-01-29

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/
 620
Author: Tadeck, 2012-01-29 02:24:49

Utilizar o método slice():

my_array.slice(-1)[0]
 305
Author: Datageek, 2017-06-14 13:49:49

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]
 91
Author: Josh, 2014-07-31 08:23:15
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.

 27
Author: Nery Jr, 2015-10-02 22:42:53

Utilizar o sistema de desconstrução es6 com o operador de spread

var last = [...yourArray].pop();

Repare que a sua raiva não muda.

 22
Author: hamecoded, 2016-12-04 20:34:31
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.

Docs Mozilla na fatia

Desempenho dos vários métodos para seleccionar o último elemento da lista

 17
Author: amay0048, 2014-07-31 08:23:25

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'
 15
Author: svarog, 2016-03-10 10:18:44

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);
 11
Author: Levi Morrison, 2012-01-29 03:09:44

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.

 8
Author: XåpplI'-I0llwlg'I -, 2017-08-24 12:17:38

No caso de estar a utilizar ES6 pode fazer:

const arr = [ 1, 2, 3 ];
[ ...arr ].pop(); // 3
arr; // [ 1, 2, 3 ] (wasn't changed)
 5
Author: Mykhailo Zhuk, 2016-06-16 18:48:28
var last = function( obj, key ) { 
    var a = obj[key];
    return a[a.length - 1];
};

last(loc, 'f096012e-2497-485d-8adb-7ec0b9352c52');
 4
Author: zellio, 2012-01-29 02:14:44

Funcionou:

array.reverse()[0]
 4
Author: Sreerag, 2016-07-26 22:54:22
Então, muitas pessoas estão respondendo com pop(), mas a maioria não parece perceber que é um método destrutivo.
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.

 4
Author: Ryan Wood, 2016-08-01 03:36:37