selectJavaScript数组中的最后一个元素

我正在制作一个实时更新用户位置和path的应用程序,并将其显示在Google地图上。 我有一些function,允许多个用户同时使用一个对象进行跟踪,每秒更新一次。

现在,当用户在Android应用中按下button时,坐标被发送到数据库,并且每当位置改变时,标记在地图上被更新(并且形成折线)。

由于我有多个用户,我发送一个唯一的随机生成的字母数字string,以便我可以为每个用户显示一个单独的path。 当JS从数据库中提取这些数据时,它会检查用户是否存在,如果不存在,它会创build一个新值,其值为一个列表。 它看起来像这样:

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。 我的程序不断地更新这个列表,每次通过添加到列表来改变位置(这个工作正常)。

我需要做的是每当位置发生变化时更新标记的位置。 我想通过select数组中的最后一个项目,因为这将是最后一个已知的位置。 现在,每当位置被改变时,新的标记被添加到地图(示例中的每个点将在该位置显示标记),因此标记被继续添加。

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

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

看起来像这样:

 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]; 

或者在更长的版本中,不创build新的variables:

 loc['f096012e-2497-485d-8adb-7ec0b9352c52'][loc['f096012e-2497-485d-8adb-7ec0b9352c52'].length - 1]; 

如何添加一个方法使其更简单

如果您是创build函数/快捷方式来完成这些任务的粉丝,请使用以下代码:

 if (!Array.prototype.last){ Array.prototype.last = function(){ return this[this.length - 1]; }; }; 

将允许您通过调用数组的last()方法获得数组的last()一个元素,例如:

 loc['f096012e-2497-485d-8adb-7ec0b9352c52'].last(); 

你可以检查它在这里工作: http : //jsfiddle.net/D4NRN/

使用slice()方法:

 my_array.slice(-1)[0] 

你也可以。最后一个元素。 要小心,这将改变数组的值 ,但是这可能对你很好。

 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 = array.slice(-1)[0]; 

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

Mozilla Docs on Slice

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

如果这对您的应用程序至关重要,请使用JavaScript对象。 您不应该使用原始基元来pipe理应用程序的关键部分。 由于这似乎是您的应用程序的核心,您应该使用对象。 我在下面写了一些代码来帮助你开始。 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); 

Underscore和Lodash有_.last(Array)方法,它返回数组中的最后一个元素。 他们都是一样的工作

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

_.last还有一个_.lastfunction

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

使用扩展运算符来使用es6解构数组

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

注意yourArray不会改变。

所以,很多人都在回答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年代那样的stream行音乐:)

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

 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] => undefined(因为你正在寻找第四个值,如果你这样做的话)(这个深度适用于任何倒霉的newbs ))。

可能不是最好的,甚至是你的应用程序的好方法,什么与交通,stream失,等等。 但是为了遍历一个数组,将数据stream传输到另一个数组,只是用低效率的方法来愚蠢的。 完全这个。

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

 if (!Array.prototype.hasOwnProperty("last")) { Object.defineProperty(Array.prototype, "last", { get: function() { return this[this.length - 1]; } }); } console.log([9, 8, 7, 6].last); // => 6 

正如你所看到的,访问看起来不像一个函数调用; getter函数在内部调用。

 var last = function( obj, key ) { var a = obj[key]; return a[a.length - 1]; }; last(loc, 'f096012e-2497-485d-8adb-7ec0b9352c52'); 

如果你使用ES6,你可以这样做:

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

这工作:

 array.reverse()[0] 

让我们假设有一个数组,我想获得数组的最后一个元素,那么这个数组可以像堆栈意味着最后一个输出。

  var myArray = [1,2,3,5]; _.last(myArray); ==> // 5