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

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


当前回答

如果这对您的应用程序很重要,请使用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);

其他回答

所以,很多人都用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年代的那种推式流行音乐:)

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 =>]。Length => undefined(因为如果你这样做,你会寻找第4个值(这个深度级别是为任何不幸的新手结束))。

对于您的应用程序来说,可能不是最好的,甚至不是一个好的方法,因为有流量、波动等等。但对于遍历一个数组,将它流到另一个数组,只是愚蠢的低效方法,这个。完全。

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

它是这样的:

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/

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)

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

var a = [1,2,3];
a.pop(); // 3
a // [1,2]