选择 JavaScript 数组中的最后一个元素

IT技术 javascript arrays google-maps google-maps-markers
2021-01-27 04:06:00

我正在制作一个应用程序,可以实时更新用户的位置和路径,并将其显示在 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)”语句从列表中获取最后一个位置并使用它来更新标记。如何从散列中的数组中选择最后一个元素?

6个回答

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

它看起来像这样:

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/

我一直想知道为什么不能JavaScript的减少从this.locations[this.locations.length-1]this.locations[-1]这不是让我们的生活更轻松一些吗?有什么理由不呢?
2021-03-28 04:06:00
这是一个旧的答案,但尤其是现在请避免改变任何内置原型(例如,这Array.prototype.last = 是一个不安全的分配)。
2021-03-30 04:06:00
我不是第一个这样说的人,也不会是最后一个:不要修改你不拥有的对象——尤其是原生原型。当 JavaScript 在 ES 规范中实现相同的方法名称但与您的略有不同时会发生什么?坏事。Prototype 和 Sugar.js 都修改了 native。最后,他们花费的时间和金钱都比他们节省的要多。
2021-04-01 04:06:00
老实说,如果这是他的应用程序的一个关键部分,他应该使用对象,而不仅仅是原型原型。我的帖子
2021-04-06 04:06:00
@LeviMorrison:您的回答更多是关于组织脚本/项目,而不是解决这个特定问题。向原型添加(自定义)函数可能不是那么干净,但老实说:这arr[arr.length - 1]是访问arr数组最后一个元素的常见且易于理解的方式
2021-04-12 04:06:00

使用slice()方法:

my_array.slice(-1)[0]
我添加了一个测试用例,您可以在其中连续调用.pop().push()似乎.slice(-1)[0]比直接访问快 10 倍,但仍然比直接访问慢 10 倍。
2021-03-19 04:06:00
相对较慢,但不是绝对慢。比替代方案慢约 100 倍,但较慢的版本仍然在我的浏览器中每秒执行近 1000 万次。
2021-03-20 04:06:00
确实这个非常慢,可以参考jsperf.com/last-element-of-array-xxx
2021-03-27 04:06:00
它也非常缓慢
2021-04-01 04:06:00
这是一个很好的答案!它可以用于单行(my_array可以用返回数组的表达式或函数替换),并且您不必对Array原型进行全局更改
2021-04-13 04:06:00

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

var a = [1,2,3];
a.pop(); // 3
a // [1,2]
@JosefJezek:是的,更慢。但是,我的意思是,您仍然可以在一秒钟内完成 2 亿次这样的操作,因此在这种情况下,最好担心什么是最具可读性的,而不是担心性能。(当然,除非你试图每秒处理数亿次)
2021-03-23 04:06:00
2021-04-02 04:06:00
只需使用 arr.concat().pop()
2021-04-04 04:06:00

使用带有扩展运算符的 es6 解构数组

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

请注意, yourArray 不会改变。

这不会创建 的副本yourArray,弹出最后一个元素然后将临时副本扔掉吗?我认为如果yourArray有大量元素,这将是一项代价高昂的操作
2021-03-25 04:06:00
@chitti 或者他们只是转到最后一个索引并为您提供该元素的副本
2021-04-11 04:06:00
var arr = [1, 2, 3];
arr.slice(-1).pop(); // return 3 and arr = [1, 2, 3]

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

我喜欢这个。它不会像 一样快arr[arr.length - 1];,因为您正在实例化一个新数组,但至少它不是一些缓慢和/或破坏性的方法, arr.reverse()[0]或者[...arr].pop();,并且您不会像大多数人一样改变内置原型(非常糟糕的做法)的其他解决方案。我要补充一点,现在您可以使用解构赋值并取消pop(),这在某些情况下可能有意义。例如const arr = [1,2,3]; const [last] = arr.slice(-1);
2021-03-15 04:06:00
太好了,结果很完美。
2021-04-05 04:06:00