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

我正在做的是将坐标列表存储为键的值,即用户的ID。我的程序会在每次通过添加到列表来更改位置时不断更新此列表(这可以正常工作)。

我需要做的是每次位置变化时更新标记的位置。我想通过选择数组中的最后一项来做到这一点,因为那将是最后一个已知位置。现在,每次位置更改时,都会向地图添加一个新的标记(示例中的每个点都会在该位置显示一个标记),以便继续添加标记。

每次位置更新时,我会使用'for(x in loc)'语句从列表中获取最后一个位置并使用它来更新标记。如何从哈希中的数组中选择最后一个元素?

1347662 次浏览

如何访问数组的最后一个元素

它看起来像这样:

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/

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


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

你不应该使用原始原语来管理应用程序的关键部分。由于这似乎是应用程序的核心,你应该使用对象来代替。我在下面写了一些代码来帮助你入门。方法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);

使用slice()方法:

my_array.slice(-1)[0]

您也可以.pop关闭最后一个元素。小心,这将改变数组的值,但这对您来说可能没问题。

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

我发现-1处的切片对于获取最后一个元素(尤其是未知长度的数组)很有用,并且性能比计算长度小于1要好得多。

Slice上的Mozilla文档

选择最后一个数组元素的各种方法的性能

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

如果数组为空,这将返回未定义,并且不会更改数组的值。

您可以在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

如您所见,access看起来不像函数调用;getter函数在内部调用。

下划线Lodash_.last(Array)方法,它返回数组中的最后一个元素。它们的工作原理大致相同

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

Ramda也有一个_.last函数

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

如果您使用ES6,您可以执行以下操作:

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

这奏效了:

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年代:)

ush将一个值附加到数组的末尾,并返回结果的长度。所以

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]=>未定义(因为如果你这样做,你会寻找第4个值(这个深度级别适用于任何不幸的新手))。

可能不是最好的,甚至不是适合您的应用程序的好方法,什么流量,流失,等等。但是对于遍历一个数组,将其流式传输到另一个数组,只是愚蠢地使用低效方法,这。完全是这样。

将es6解构数组与扩展运算符一起使用

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

请注意,你的数组不会改变。