Sélection du dernier élément du tableau JavaScript [dupliquer]

cette question a déjà une réponse ici:

  • Obtenir le dernier élément d'un tableau de 34 réponses

je fais une application qui met à jour l'emplacement et le chemin d'un utilisateur en temps réel et affiche cela sur une carte de Google. J'ai fonctionnalité qui permet à plusieurs utilisateurs d'être suivis à l' le même temps en utilisant un objet, qui est mis à jour à chaque seconde.

en ce moment, quand un utilisateur a appuyé sur un bouton dans L'application Android, les coordonnées sont envoyées à une base de données et chaque fois que l'emplacement change, un marqueur est mis à jour sur la carte (et un polyligne est formé).

comme j'ai plusieurs utilisateurs, j'envoie une chaîne alphanumérique unique générée au hasard pour que je puisse afficher un chemin individuel pour chaque utilisateur. Lorsque le JS tire ces données de la la base de données, il vérifie si l'utilisateur existe, si elle n'est pas, il crée une nouvelle clé de la valeur d'une liste. Cela ressemblerait à quelque chose comme ceci:

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

ce que je fais est de stocker une liste de coordonnées comme valeur de la clé, qui est L'ID de l'utilisateur. Mon programme continue de mettre à jour cette liste chaque fois que l'emplacement est modifié en ajoutant à la liste (cela fonctionne correctement).

ce que je dois faire est de mettre à jour l'emplacement du marqueur chaque fois que l'emplacement changement. Je voudrais le faire en sélectionnant le dernier élément du tableau depuis que serait le dernier emplacement connu. Maintenant, chaque fois que l'emplacement est modifié, un nouveau marqueur est ajouté à la carte (chacun des points dans l'exemple devrait montrer un marqueur à cet endroit) donc marqueurs continuent d'être ajoutés.

j'utiliserais une instruction for (X in loc)` chaque fois que l'emplacement est mis à jour pour saisir le dernier emplacement de la liste et l'utiliser pour mettre à jour le marqueur. Comment puis-je sélectionner ce dernier élément du tableau dans le hachage?

366
demandé sur Sebastian Zartner 2012-01-29 06:11:43

13 réponses

Comment accéder au dernier élément d'un tableau

Il ressemble à ça:

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

Qui dans votre cas ressemble à ceci:

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

ou, en version longue, sans créer de nouvelles variables:

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

comment ajouter une méthode pour la simplifier

si vous êtes un ventilateur pour créer des fonctions / raccourcis pour accomplir de telles tâches, le code suivant:

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

vous permettra d'obtenir le dernier élément d'un tableau en invoquant la méthode last() de array, dans votre cas par exemple.:

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

vous pouvez vérifier qu'il fonctionne ici: http://jsfiddle.net/D4NRN /

620
répondu Tadeck 2012-01-29 02:24:49

utiliser la méthode slice() :

my_array.slice(-1)[0]
305
répondu Datageek 2017-06-14 13:49:49

vous pouvez aussi .pop du dernier élément. faites attention, cela va changer la valeur du tableau , mais cela pourrait être OK pour vous.

var a = [1,2,3];
a.pop(); // 3
a // [1,2]
91
répondu Josh 2014-07-31 08:23:15
var arr = [1, 2, 3];
arr.slice(-1).pop(); // return 3 and arr = [1, 2, 3]

cela retournera Non défini si le tableau est vide et cela ne changera pas la valeur du tableau.

27
répondu Nery Jr 2015-10-02 22:42:53

utiliser le tableau de déconstruction es6 avec l'opérateur spread

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

notez que yourArray ne change pas.

22
répondu hamecoded 2016-12-04 20:34:31
var last = array.slice(-1)[0];

je trouve tranche à -1 utile pour obtenir le dernier élément (en particulier d'un tableau de longueur inconnue) et la performance est beaucoup mieux que de calculer la longueur moins 1.

Mozilla Docs sur la Tranche

Performance des différentes méthodes de sélection du dernier élément de tableau

17
répondu amay0048 2014-07-31 08:23:25

trait de Soulignement et Lodash ont le _.last(Array) méthode, qui renvoie le dernier élément dans un Tableau. Ils travaillent tous les deux à peu près le même

_.last([5, 4, 3, 2, 1]);
=> 1

Ramda a également une _.last fonction

R.last(['fi', 'fo', 'fum']); //=> 'fum'
15
répondu svarog 2016-03-10 10:18:44

utilisez les objets JavaScript si cela est critique pour votre application. vous ne devriez pas utiliser des primitives brutes pour gérer les parties critiques de votre application. Comme cela semble être le cœur de votre application, vous devez utiliser des objets à la place. J'ai écrit un code ci-dessous pour vous aider à démarrer. La méthode lastLocation retournerait le dernier emplacement.


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
répondu Levi Morrison 2012-01-29 03:09:44

vous pouvez définir un getter sur 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

comme vous pouvez le voir, l'accès ne ressemble pas à un appel de fonction; la fonction getter est appelée en interne.

8
répondu XåpplI'-I0llwlg'I - 2017-08-24 12:17:38

dans le cas où vous utilisez ES6 vous pouvez faire:

const arr = [ 1, 2, 3 ];
[ ...arr ].pop(); // 3
arr; // [ 1, 2, 3 ] (wasn't changed)
5
répondu 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
répondu zellio 2012-01-29 02:14:44

cela a fonctionné:

array.reverse()[0]
4
répondu Sreerag 2016-07-26 22:54:22

donc, beaucoup de gens répondent avec pop (), mais la plupart d'entre eux ne semblent pas réaliser que c'est une méthode destructrice.

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

donc, pour une méthode vraiment stupide, non destructive:

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

push pop, comme dans les années 90 :)

push ajoute une valeur à la fin d'un tableau, et renvoie la longueur de la suite. so

d=[]
d.push('life') 
//=> 1
d 
//=>['life']

pop renvoie la valeur du dernier élément d'un tableau, avant de supprimer cette valeur à cet indice. so

c = [1,2,1]
c.pop() 
//=> 1
c 
//=> [1,2]
Les tableaux

sont indexés à 0, donc C. Longueur => 3, c[C. length] = > undefined(parce que vous cherchez la 4ème valeur si vous faites cela (ce niveau de profondeur est pour tous les newbs malheureux qui finissent ici)).

probablement pas la meilleure, ou même une bonne méthode pour votre application, Quoi avec le trafic, barattage, bla. mais pour traverser un tableau, le diffuser sur un autre, juste être idiot avec méthodes inefficaces, ce. Totalement ce.

4
répondu Ryan Wood 2016-08-01 03:36:37