objects funciona findindex elemento ejemplo como buscar array javascript arrays google-maps google-maps-markers

funciona - Seleccionando el último elemento en la matriz de JavaScript



indexof javascript ejemplo (13)

Esta pregunta ya tiene una respuesta aquí:

Estoy creando una aplicación que actualiza la ubicación y la ruta de un usuario en tiempo real y la muestra en un mapa de Google. Tengo una funcionalidad que permite realizar un seguimiento de varios usuarios al mismo tiempo utilizando un objeto, que se actualiza cada segundo.

En este momento, cuando un usuario presiona un botón en la aplicación Android, las coordenadas se envían a una base de datos y cada vez que cambia la ubicación, se actualiza un marcador en el mapa (y se forma una polilínea).

Como tengo varios usuarios, envío una cadena alfanumérica única y generada aleatoriamente para que pueda mostrar una ruta individual para cada usuario. Cuando el JS extrae estos datos de la base de datos, comprueba si el usuario existe, si no es así, crea una nueva clave con el valor como una lista. Se vería algo como esto:

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

Lo que estoy haciendo es almacenar una lista de coordenadas como el valor de la clave, que es la ID del usuario. Mi programa sigue actualizando esta lista cada vez que se cambia la ubicación agregando a la lista (esto funciona correctamente).

Lo que debo hacer es actualizar la ubicación del marcador cada vez que cambie la ubicación. Me gustaría hacer esto seleccionando el último elemento de la matriz, ya que sería la última ubicación conocida. En este momento, cada vez que se cambia la ubicación, se agrega un nuevo marcador al mapa (cada uno de los puntos en el ejemplo mostraría un marcador en esa ubicación), por lo que los marcadores continúan agregándose.

Usaría una declaración ''for (x in loc)'' cada vez que la ubicación se actualice para tomar la última ubicación de la lista y usarla para actualizar el marcador. ¿Cómo selecciono este último elemento de la matriz dentro del hash?


Cómo acceder al último elemento de una matriz

Se ve así:

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

Que en tu caso se parece a esto:

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

O, en versión más larga, sin crear nuevas variables:

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

Cómo agregar un método para hacerlo más simple.

Si es un fanático de la creación de funciones / accesos directos para realizar dichas tareas, el siguiente código:

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

le permitirá obtener el último elemento de una matriz invocando el método last() la matriz, en su caso, por ejemplo:

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

Puede comprobar que funciona aquí: http://jsfiddle.net/D4NRN/


En caso de que estés usando ES6 puedes hacer:

const arr = [ 1, 2, 3 ]; [ ...arr ].pop(); // 3 arr; // [ 1, 2, 3 ] (wasn''t changed)


Entonces, mucha gente está respondiendo con pop (), pero la mayoría de ellos no parece darse cuenta de que es un método destructivo.

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

Entonces, para un método realmente tonto, no destructivo:

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

Un push pop, como en los años 90 :)

push agrega un valor al final de una matriz y devuelve la longitud del resultado. asi que

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

pop devuelve el valor del último elemento de una matriz, antes de que elimine ese valor en ese índice. asi que

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

las matrices están 0 indexadas, por lo que c.length => 3, c [c.length] => undefined (porque estás buscando el cuarto valor si lo haces (este nivel de profundidad es para cualquier newbs desafortunado que termine aquí) )).

Probablemente no sea el mejor, ni siquiera un buen método para su aplicación, con tráfico, churn, blah. pero para atravesar una matriz, transmitirla a otra, simplemente ser tonto con métodos ineficientes, esto. Totalmente esto.


Esto funcionó:

var last = function( obj, key ) { var a = obj[key]; return a[a.length - 1]; }; last(loc, ''f096012e-2497-485d-8adb-7ec0b9352c52'');


Puedes definir un getter en 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 puede ver, el acceso no se parece a una llamada de función; La función getter se llama internamente.


También puedes quitar el último elemento. Tenga cuidado, esto cambiará el valor de la matriz , pero eso podría estar bien para usted.

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


Usa el método slice() :

my_array.slice(-1)[0]


Utilice la matriz de deconstrucción es6 con el operador de propagación

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

tenga en cuenta que yourArray no cambia.


Underscore y Lodash tienen el _.last(Array) , que devuelve el último elemento en un Array. Ambos trabajan de la misma manera.

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

Ramda también tiene una función _.last

R.last([''fi'', ''fo'', ''fum'']); //=> ''fum''


Use objetos de JavaScript si esto es crítico para su aplicación. No debe usar primitivas en bruto para administrar partes críticas de su aplicación. Como este parece ser el núcleo de su aplicación, debe usar objetos en su lugar. He escrito algunos códigos a continuación para ayudarte a comenzar. El método lastLocation devolvería la última ubicación.

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]


var arr = [1, 2, 3]; arr.slice(-1).pop(); // return 3 and arr = [1, 2, 3]

Esto volverá indefinido si la matriz está vacía y esto no cambiará el valor de la matriz.