我正在制作一个应用程序,实时更新用户的位置和路径,并在谷歌地图上显示这一点。我有功能,允许多个用户同时跟踪使用对象,这是每秒钟更新一次。

现在,当用户在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) '语句从列表中获取最后一个位置并使用它来更新标记。我如何从哈希数组中选择这最后一个元素?


当前回答

你也可以去掉最后一个元素。注意,这将改变数组的值,但这对您来说可能没问题。

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,并且不会改变数组的值。

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

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

你可以在Array.prototype上定义一个getter:

if (!Array.prototype.hasOwnProperty("last")) { Object.defineProperty(Array.prototype, "last", { get () { 返回这个[。长度- 1]; } }); } Console.log ([9,8,7,6].last);// =>

如你所见,访问不像函数调用;getter函数在内部调用。

如果你正在使用ES6,你可以做:

const arr = [ 1, 2, 3 ];
[ ...arr ].pop(); // 3
arr; // [ 1, 2, 3 ] (wasn't changed)
var last = array.slice(-1)[0];

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

Slice上的Mozilla Docs

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