Выбор последнего элемента в массиве JavaScript

Я делаю приложение, которое обновляет местоположение и путь пользователя в реальном времени и отображает это на карте Google. У меня есть функциональность, позволяющая отслеживать несколько пользователей одновременно с использованием объекта, который обновляется каждую секунду.

Прямо сейчас, когда пользователь нажал кнопку в приложении Android, координаты отправляются в базу данных, и каждый раз, когда местоположение изменяется, маркер обновляется на карте (и формируется полилиния).

Поскольку у меня несколько пользователей, я отправляю уникальную и случайно сгенерированную буквенно-цифровую строку, чтобы я мог отображать индивидуальный путь для каждого пользователя. Когда JS вытаскивает эти данные из базы данных, он проверяет, существует ли пользователь, если он этого не делает, он создает новый ключ со значением, являющимся списком. Это будет выглядеть примерно так:

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

То, что я делаю, это хранить список координат в качестве значения ключа, который является идентификатором пользователя. Моя программа постоянно обновляет этот список при каждом изменении местоположения путем добавления в список (это работает правильно).

Что мне нужно сделать, это обновлять местоположение маркера при каждом изменении местоположения. Я хотел бы сделать это, выбрав последний элемент в массиве, так как это будет последнее известное местоположение. Прямо сейчас, каждый раз, когда местоположение изменяется, к карте добавляется новый маркер (каждая из точек в примере показывает маркер в этом месте), поэтому маркеры продолжают добавляться.

Я бы использовал инструкцию'for (x in loc) 'каждый раз, когда местоположение обновляется, чтобы захватить последнее местоположение из списка и использовать это для обновления маркера. Как выбрать последний элемент из массива в хеше?

Ответ 1

Как получить доступ к последнему элементу массива

Это выглядит так:

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

Что в вашем случае выглядит так:

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

или, в более длинной версии, без создания новых переменных:

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

Как добавить метод для упрощения

Если вы являетесь поклонником создания функций/ярлыков для выполнения таких задач, используйте следующий код:

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

позволит вам получить последний элемент массива, вызвав метод array last(), например, в вашем случае:

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

Вы можете проверить, что он работает здесь: http://jsfiddle.net/D4NRN/

Ответ 2

Используйте метод slice():

my_array.slice(-1)[0]

Ответ 3

Вы также .pop отменить последний элемент. Будьте осторожны, это изменит значение массива, но для вас это будет нормально.

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

Ответ 4

использовать eson deconstruction array с оператором распространения

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

обратите внимание, что yourArray не изменяется.

Ответ 5

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

Это вернет undefined, если массив пуст, и это не изменит значение массива.

Ответ 6

var last = array.slice(-1)[0];

Я нахожу фрагмент в -1, полезный для получения последнего элемента (особенно из массива неизвестной длины), а производительность намного лучше, чем вычисление длины меньше 1.

Документы Mozilla на фрагменте

Выполнение различных методов выбора последнего элемента массива

Ответ 7

Подчеркивание и Lodash имеют метод _.last(Array), который возвращает последний элемент в массиве. Они оба работают примерно одинаково

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

У Рамды также есть _.last функция

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

Ответ 8

Используйте объекты JavaScript, если это важно для вашего приложения. Вы не должны использовать исходные примитивы для управления критическими частями вашего приложения. Поскольку это, по-видимому, ядро вашего приложения, вы должны использовать объекты вместо этого. Я написал код ниже, чтобы помочь вам начать работу. Метод lastLocation вернет последнее местоположение.


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

Ответ 9

Вы можете определить геттер на 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

Ответ 10

Это сработало:

array.reverse()[0]

Ответ 11

Если вы используете ES6, вы можете:

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

Ответ 12

Таким образом, многие люди отвечают на pop(), но большинство из них, похоже, не понимают, что это разрушительный метод.

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

Итак, для действительно глупых, неразрушающих методов:

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

толчок, как в 90-е годы :)

push добавляет значение в конец массива и возвращает длину результата. так

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

pop возвращает значение последнего элемента массива до того, как оно удалит это значение в этом индексе. так

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

массивы индексируются 0, поэтому c.length => 3, c [c.length] => undefined (потому что вы ищете 4-е значение, если вы это сделаете (этот уровень глубины для любых несчастных новичков, которые здесь )).

Наверное, не лучший, или даже хороший метод для вашего приложения, что с трафиком, оттоком, бла. но для обхода массива, перетекания его на другой, просто глупо с неэффективными методами. Полностью это.

Ответ 13

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

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