Выбор последнего элемента в массиве 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)
каждый раз, когда обновляется местоположение, чтобы извлечь последнее местоположение из списка и использовать его для обновления маркера. Как мне выбрать этот последний элемент из массива внутри хэша?
5 ответ(ов)
Как получить последний элемент массива
Это выглядит следующим образом:
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/
Вы можете использовать метод slice()
, чтобы получить последний элемент массива. Вот пример кода:
my_array.slice(-1)[0]
Этот код использует slice(-1)
, который возвращает массив, содержащий последний элемент исходного массива, а затем [0]
извлекает этот элемент из нового массива.
Такой подход безопасен и позволяет избежать ошибок, если массив пустой.
Вы также можете использовать метод .pop()
, чтобы удалить последний элемент массива. Учтите, что это изменит значение массива, но, возможно, это вас устраивает.
var a = [1, 2, 3];
a.pop(); // 3
a; // [1, 2]
Вы можете использовать синтаксис ES6 для деструктуризации массивов с оператором распространения (spread operator) следующим образом:
var last = [...yourArray].pop();
Обратите внимание, что в этом случае yourArray
не изменяется. Оператор распространения создает новый массив, который является копией исходного, а метод pop()
удаляет и возвращает последний элемент этого нового массива. Это позволяет вам безопасно получить последний элемент без изменения оригинального массива.
Ваш код 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); // []
Таким образом, данный код можно использовать для безопасного получения последнего элемента массива без изменения самого массива.
Как перемешать (сделать случайным) массив в JavaScript?
Как объединить два массива в JavaScript и удалить дубликаты?
Как очистить массив в JavaScript?
Как получить доступ к вложенным объектам, массивам или JSON и обработать их?
Как удалить все дубликаты из массива объектов?