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


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

  • Получить последний элемент в массиве. 34 ответы

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

13 366

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

Я нахожу slice at -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. length = > 3, c[C.length] = > undefined (потому что вы ищете 4-е значение, если вы это сделаете(этот уровень глубины для любых несчастных новичков, которые заканчиваются здесь)).

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