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

этот вопрос уже есть ответ здесь:

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

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

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

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) каждый раз, когда обновляется местоположение, чтобы захватить последнее местоположение из списка и использовать его для обновления маркера. Как выбрать последний элемент из массива в хэш?

13 ответов


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

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

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

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

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

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


использовать slice() способ:

my_array.slice(-1)[0]

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

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]

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


используйте массив деконструкции es6 с оператором spread

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

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


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

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

Mozilla Docs on Slice

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


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

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

Ramda также _.last функции

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

использовать объекты 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);

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

Как вы можете видеть, access не похож на вызов функции; функция getter вызывается внутренне.


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

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

это работает:

array.reverse()[0]

Итак, многие люди отвечают 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-е :)

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

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

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

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

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

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