8

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

4

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

5 ответ(ов)

11

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

Это выглядит следующим образом:

var my_array = /* здесь какой-то массив */;
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/

7

Вы можете использовать метод slice(), чтобы получить последний элемент массива. Вот пример кода:

my_array.slice(-1)[0]

Этот код использует slice(-1), который возвращает массив, содержащий последний элемент исходного массива, а затем [0] извлекает этот элемент из нового массива.

Такой подход безопасен и позволяет избежать ошибок, если массив пустой.

1

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

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

Вы можете использовать синтаксис ES6 для деструктуризации массивов с оператором распространения (spread operator) следующим образом:

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

Обратите внимание, что в этом случае yourArray не изменяется. Оператор распространения создает новый массив, который является копией исходного, а метод pop() удаляет и возвращает последний элемент этого нового массива. Это позволяет вам безопасно получить последний элемент без изменения оригинального массива.

0

Ваш код arr.slice(-1).pop(); возвращает 3, и массив arr остается неизменным ([1, 2, 3]).

Если массив будет пустым, вызов slice(-1) вернет новый пустой массив, и последующий вызов pop() на нем вернет undefined, поскольку в пустом массиве нет элементов. Важно отметить, что сама переменная arr не изменяется и остается той же самой.

Вот небольшой пример:

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

var emptyArr = [];
console.log(emptyArr.slice(-1).pop()); // undefined
console.log(emptyArr); // []

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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь