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
还有一个_.last
function
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