javascript - tutorial - js array




Selezione dell'ultimo elemento nell'array JavaScript (9)

Questa domanda ha già una risposta qui:

Sto creando un'applicazione che aggiorna la posizione e il percorso di un utente in tempo reale e la visualizza su una mappa di Google. Dispongo di funzionalità che consentono di monitorare più utenti contemporaneamente utilizzando un oggetto, che viene aggiornato ogni secondo.

In questo momento, quando un utente preme un pulsante nell'app per Android, le coordinate vengono inviate a un database e ogni volta che cambia la posizione, un marker viene aggiornato sulla mappa (e viene formata una polilinea).

Poiché ho più utenti, invio una stringa alfanumerica univoca e generata in modo casuale in modo da poter visualizzare un singolo percorso per ciascun utente. Quando JS estrae questi dati dal database, controlla se l'utente esiste, in caso contrario crea una nuova chiave con il valore come elenco. Sarebbe simile a questo:

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)]}

Quello che sto facendo è memorizzare un elenco di coordinate come valore della chiave, che è l'ID dell'utente. Il mio programma continua ad aggiornare questo elenco ogni volta che la posizione viene modificata aggiungendo alla lista (questo funziona correttamente).

Quello che devo fare è aggiornare la posizione del marcatore ogni volta che cambia la posizione. Mi piacerebbe farlo selezionando l'ultimo elemento dell'array dato che sarebbe l'ultima posizione nota. In questo momento, ogni volta che la posizione viene cambiata, viene aggiunto un nuovo marcatore alla mappa (ognuno dei punti nell'esempio mostrerebbe un indicatore in quella posizione) in modo che i marcatori continuino ad essere aggiunti.

Vorrei usare una dichiarazione'for (x in loc) `ogni volta che la posizione si aggiorna per prendere l'ultima posizione dall'elenco e usarla per aggiornare l'indicatore. Come seleziono questo ultimo elemento dall'array all'interno dell'hash?


Come accedere all'ultimo elemento di un array

Sembra che:

var my_array = /* some array here */;
var last_element = my_array[my_array.length - 1];

Che nel tuo caso assomiglia a questo:

var array1 = loc['f096012e-2497-485d-8adb-7ec0b9352c52'];
var last_element = array1[array1.length - 1];

o, nella versione più lunga, senza creare nuove variabili:

loc['f096012e-2497-485d-8adb-7ec0b9352c52'][loc['f096012e-2497-485d-8adb-7ec0b9352c52'].length - 1];

Come aggiungere un metodo per renderlo più semplice

Se sei un fan per la creazione di funzioni / scorciatoie per svolgere tali compiti, il seguente codice:

if (!Array.prototype.last){
    Array.prototype.last = function(){
        return this[this.length - 1];
    };
};

ti permetterà di ottenere l'ultimo elemento di un array invocando il metodo last() dell'array, nel tuo caso eg .:

loc['f096012e-2497-485d-8adb-7ec0b9352c52'].last();

Puoi controllare che funzioni qui: http://jsfiddle.net/D4NRN/


È possibile definire un getter su 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

Come puoi vedere, l'accesso non assomiglia a una chiamata di funzione; la funzione getter è chiamata internamente.


Puoi anche. .pop l'ultimo elemento. Stai attento, questo cambierà il valore dell'array , ma potrebbe andar bene per te.

var a = [1,2,3];
a.pop(); // 3
a // [1,2]

Questo ha funzionato:

var last = function( obj, key ) { 
    var a = obj[key];
    return a[a.length - 1];
};

last(loc, 'f096012e-2497-485d-8adb-7ec0b9352c52');

Usa il metodo slice() :

my_array.slice(-1)[0]

utilizzare l'array di decostruzione es6 con l'operatore di diffusione

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

nota che yourArray non cambia.


Usa oggetti JavaScript se questo è fondamentale per la tua applicazione. Non dovresti utilizzare primitive non elaborate per gestire parti critiche della tua applicazione. Poiché questo sembra essere il nucleo della tua applicazione, dovresti invece usare gli oggetti. Ho scritto del codice qui sotto per aiutarti a iniziare. Il metodo lastLocation restituirebbe l'ultima posizione.

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);

array.reverse()[0]







google-maps-markers