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?
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 /
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]
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.
utiliser le tableau de déconstruction es6 avec l'opérateur spread
var last = [...yourArray].pop();
notez que yourArray ne change pas.
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.
Performance des différentes méthodes de sélection du dernier élément de tableau
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'
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);
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.
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)
var last = function( obj, key ) {
var a = obj[key];
return a[a.length - 1];
};
last(loc, 'f096012e-2497-485d-8adb-7ec0b9352c52');
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.