Je crée une application qui met à jour l'emplacement et le chemin d'un utilisateur en temps réel et l'affiche sur une carte Google. J'ai des fonctionnalités qui permettent à plusieurs utilisateurs d'être suivis en même temps à l'aide d'un objet mis à jour toutes les secondes.
À l'heure actuelle, lorsqu'un utilisateur appuie sur un bouton de 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 une polyligne est formée).
Étant donné que j'ai plusieurs utilisateurs, j'envoie une chaîne alphanumérique unique et générée aléatoirement afin de pouvoir afficher un chemin individuel pour chaque utilisateur. Lorsque le JS extrait ces données de la base de données, il vérifie si l'utilisateur existe. Dans le cas contraire, il crée une nouvelle clé dont la valeur est une liste. Cela ressemblerait à 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 en tant que valeur de la clé, qui est l'identifiant de l'utilisateur. Mon programme continue à mettre à jour cette liste chaque fois que l'emplacement est modifié en l'ajoutant à la liste (cela fonctionne correctement).
Ce que je dois faire, c'est mettre à jour l'emplacement du marqueur à chaque changement d'emplacement. Je voudrais faire ceci en sélectionnant le dernier élément du tableau car ce serait le dernier emplacement connu. À l'heure actuelle, chaque fois que l'emplacement est modifié, un nouveau marqueur est ajouté à la carte (chacun des points de l'exemple affichera un marqueur à cet emplacement) afin que les marqueurs continuent à ê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 sélectionner ce dernier élément du tableau dans le hachage?
Ça ressemble à ça:
var my_array = /* some array here */;
var last_element = my_array[my_array.length - 1];
Ce qui dans votre cas ressemble à ceci:
var array1 = loc['f096012e-2497-485d-8adb-7ec0b9352c52'];
var last_element = array1[array1.length - 1];
ou, dans une version plus longue, sans créer de nouvelles variables:
loc['f096012e-2497-485d-8adb-7ec0b9352c52'][loc['f096012e-2497-485d-8adb-7ec0b9352c52'].length - 1];
Si vous êtes fan de la création de 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 appelant la méthode last()
du tableau, dans votre cas, par exemple:
loc['f096012e-2497-485d-8adb-7ec0b9352c52'].last();
Vous pouvez vérifier que cela fonctionne ici: http://jsfiddle.net/D4NRN/
Utilisez la méthode slice()
:
my_array.slice(-1)[0]
Vous pouvez également .pop
désactiver le dernier élément. Attention, cela changera la valeur du tablea, mais cela pourrait vous convenir.
var a = [1,2,3];
a.pop(); // 3
a // [1,2]
utiliser es6 deconstruction array avec l'opérateur spread
var last = [...yourArray].pop();
notez que votre tableau ne change pas.
var arr = [1, 2, 3];
arr.slice(-1).pop(); // return 3 and arr = [1, 2, 3]
Cela retournera undefined si le tableau est vide et cela ne changera pas la valeur du tableau.
var last = array.slice(-1)[0];
Je trouve slice à -1 utile pour obtenir le dernier élément (en particulier d’un tableau de longueur inconnue) et la performance est bien meilleure que le calcul d’une longueur inférieure à 1.
Performances des différentes méthodes de sélection du dernier élément du tablea
Vous pouvez définir un getter sur Array.prototype
:
if (!Array.prototype.hasOwnProperty("last")) {
Object.defineProperty(Array.prototype, "last", {
get() {
return this[this.length - 1];
}
});
}
console.log([9, 8, 7, 6].last); // => 6
Comme vous pouvez le constater, l'accès ne ressemble pas à un appel de fonction. la fonction getter est appelée en interne.
tilisez des objets JavaScript si cela est essentiel pour votre application. Vous ne devriez pas utiliser de primitives brutes pour gérer les parties critiques de votre application. Comme cela semble être le cœur de votre application, vous devriez plutôt utiliser des objets. J'ai écrit du code ci-dessous pour vous aider à démarrer. La méthode lastLocation
renverrait 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);
Cela a fonctionné:
array.reverse()[0]
Si vous utilisez ES6, vous pouvez effectuer les tâches suivantes:
const arr = [ 1, 2, 3 ];
[ ...arr ].pop(); // 3
arr; // [ 1, 2, 3 ] (wasn't changed)
Donc, beaucoup de gens répondent avec pop (), mais la plupart d'entre eux ne semblent pas se rendre compte que c'est une méthode destructive.
var a = [1,2,3]
a.pop()
//3
//a is now [1,2]
Donc, pour une méthode vraiment stupide et non destructive:
var a = [1,2,3]
a[a.Push(a.pop())-1]
//3
un push pop, comme dans les années 90 :)
Push ajoute une valeur à la fin d'un tableau et renvoie la longueur du résultat. alors
d=[]
d.Push('life')
//=> 1
d
//=>['life']
pop renvoie la valeur du dernier élément d'un tableau, avant qu'il ne supprime cette valeur à cet index. alors
c = [1,2,1]
c.pop()
//=> 1
c
//=> [1,2]
les tableaux sont 0 indexés, donc c.length => 3, c [c.length] => undefined (parce que vous cherchez la 4ème valeur si vous faites cela (ce niveau de profondeur est pour tout infâme newbs qui finit ici )).
Probablement pas la meilleure méthode, ni même une bonne méthode pour votre application, que ce soit avec le trafic, le désabonnement, le blah. mais pour parcourir un tableau, le diffuser sur un autre, juste pour être idiot avec des méthodes inefficaces, ceci. Totalement ça.
var last = function( obj, key ) {
var a = obj[key];
return a[a.length - 1];
};
last(loc, 'f096012e-2497-485d-8adb-7ec0b9352c52');