mky*_*ong 497 javascript arrays google-maps google-maps-markers
我正在制作一个实时更新用户位置和路径的应用程序,并在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)]}
Run Code Online (Sandbox Code Playgroud)
我正在做的是存储一个坐标列表作为键的值,这是用户的ID.每次更改位置时,我的程序会通过添加到列表来更新此列表(这可以正常工作).
我需要做的是每次位置更改时更新标记的位置.我想通过选择数组中的最后一项来做到这一点,因为那将是最后一个已知的位置.现在,每次更改位置时,都会向地图添加一个新标记(示例中的每个点都会在该位置显示标记),因此继续添加标记.
每次位置更新时,我会使用'for(x in loc)`语句从列表中获取最后一个位置并使用它来更新标记.如何在哈希中从数组中选择最后一个元素?
Tad*_*eck 778
它看起来像这样:
var my_array = /* some array here */;
var last_element = my_array[my_array.length - 1];
Run Code Online (Sandbox Code Playgroud)
在您的情况下,这看起来像这样:
var array1 = loc['f096012e-2497-485d-8adb-7ec0b9352c52'];
var last_element = array1[array1.length - 1];
Run Code Online (Sandbox Code Playgroud)
或者,在更长的版本中,不创建新变量:
loc['f096012e-2497-485d-8adb-7ec0b9352c52'][loc['f096012e-2497-485d-8adb-7ec0b9352c52'].length - 1];
Run Code Online (Sandbox Code Playgroud)
如果您是创建功能/快捷方式以完成此类任务的粉丝,请使用以下代码:
if (!Array.prototype.last){
Array.prototype.last = function(){
return this[this.length - 1];
};
};
Run Code Online (Sandbox Code Playgroud)
将允许您通过调用数组的last()
方法获取数组的最后一个元素,例如:
loc['f096012e-2497-485d-8adb-7ec0b9352c52'].last();
Run Code Online (Sandbox Code Playgroud)
你可以在这里查看它的工作原理:http://jsfiddle.net/D4NRN/
Dat*_*eek 424
使用slice()
方法:
my_array.slice(-1)[0]
Run Code Online (Sandbox Code Playgroud)
Jos*_*osh 118
你也可以.pop
关掉最后一个元素.小心,这会改变数组的值,但这对你来说可能没问题.
var a = [1,2,3];
a.pop(); // 3
a // [1,2]
Run Code Online (Sandbox Code Playgroud)
ham*_*ded 46
将es6解构数组与扩展运算符一起使用
var last = [...yourArray].pop();
请注意,yourArray不会更改.
Ner*_* Jr 32
var arr = [1, 2, 3];
arr.slice(-1).pop(); // return 3 and arr = [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
如果数组为空,这将返回undefined,这不会更改数组的值.
ama*_*048 24
var last = array.slice(-1)[0];
Run Code Online (Sandbox Code Playgroud)
我发现-1处的切片对于获取最后一个元素(特别是未知长度的数组)非常有用,并且性能比计算长度减去1要好得多.
sva*_*rog 22
下划线和Lodash有_.last(Array)
方法,返回的最后一个数组中的元素.他们都是一样的
_.last([5, 4, 3, 2, 1]);
=> 1
Run Code Online (Sandbox Code Playgroud)
Ramda也有一个_.last
功能
R.last(['fi', 'fo', 'fum']); //=> 'fum'
Run Code Online (Sandbox Code Playgroud)
Lev*_*son 13
如果这对您的应用程序至关重要,请使用JavaScript对象.您不应该使用原始基元来管理应用程序的关键部分.由于这似乎是您的应用程序的核心,您应该使用对象.我在下面写了一些代码来帮助你入门.该方法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);
Run Code Online (Sandbox Code Playgroud)
Xåp*_* - 12
您可以定义吸上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
Run Code Online (Sandbox Code Playgroud)
如您所见,访问看起来不像函数调用; getter函数在内部调用.
小智 10
这有效:
array.reverse()[0]
Run Code Online (Sandbox Code Playgroud)
小智 9
如果您使用ES6,您可以:
const arr = [ 1, 2, 3 ];
[ ...arr ].pop(); // 3
arr; // [ 1, 2, 3 ] (wasn't changed)
Run Code Online (Sandbox Code Playgroud)
所以,很多人都在回答pop(),但是他们中的大多数人似乎并没有意识到这是一种破坏性的方法.
var a = [1,2,3]
a.pop()
//3
//a is now [1,2]
Run Code Online (Sandbox Code Playgroud)
所以,对于一个非常愚蠢,非破坏性的方法:
var a = [1,2,3]
a[a.push(a.pop())-1]
//3
Run Code Online (Sandbox Code Playgroud)
推出流行音乐,就像在90年代:)
push将值附加到数组的末尾,并返回结果的长度.所以
d=[]
d.push('life')
//=> 1
d
//=>['life']
Run Code Online (Sandbox Code Playgroud)
pop返回数组的最后一项的值,然后在该索引处删除该值.所以
c = [1,2,1]
c.pop()
//=> 1
c
//=> [1,2]
Run Code Online (Sandbox Code Playgroud)
数组索引0,所以c.length => 3,C [c.length] =>未定义(因为你正在寻找的第4个值,如果你这样做(这层深度的是,在这里结束了倒霉的任何newbs )).
对于你的应用来说,可能不是最好的,甚至是一个好的方法,交通,流失,等等.但是为了遍历一个数组,将它流式传输到另一个数组,只是用低效的方法愚蠢,这个.完全是这个.
var last = function( obj, key ) {
var a = obj[key];
return a[a.length - 1];
};
last(loc, 'f096012e-2497-485d-8adb-7ec0b9352c52');
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
819472 次 |
最近记录: |