按公共值对javascript对象进行分组

时间:2013-05-12 13:09:04

标签: javascript arrays object

我有一个数据库查询,它从我的数据库返回一堆基于位置的数据。我最终得到了一个对象列表(我把它放在一个对象和console.log()中,看看里面是什么)。

每个对象代表一个用户的条目,其中包含有关该位置的注释:

它包含:商店名称,地址,用户ID,备注。

这么多人可以访问该位置并写下不同的笔记。我想要做的是将位置放在Google Map(JS API)上,并按位置分组,因此当点击标记时,它包含该位置的所有注释。

所以我考虑将地址返回的对象分组,然后为每个地址绘制标记并循环。

for (var i = 0; i < rowCountVisits; i++) {
    var storelatlng = new google.maps.LatLng(
    parseFloat(result[2].latVisit[i]),
    parseFloat(result[2].lngVisit[i]));
    locationsObjVisits.push({
        storelatlng: storelatlng,
        vName: result[2].vName[i],
        address: result[2].locationVisit[i],
        date: result[2].dateVisit[i],
        notes: result[2].notes[i],
        usersName: result[2].user.thisName[i],
        thisColour: result[2].user.thisColour[i]
    });
}

所以locationsObjVisits ......我不知道该如何处理。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

我会将locationsObjVisits存储在具有数组属性的对象中,并使用地址作为键。所以:

var locationsObjs = {};

for (var i = 0; i < rowCountVisits; i++) {
    var storelatlng = new google.maps.LatLng(
    parseFloat(result[2].latVisit[i]),
    parseFloat(result[2].lngVisit[i]));
    var address = result[2].locationVisit[i];

    locationsObjs[address] = locationsObjs[address] || [];
    locationObjs[address].push({
        storelatlng: storelatlng,
        vName: result[2].vName[i],
        address: address,
        date: result[2].dateVisit[i],
        notes: result[2].notes[i],
        usersName: result[2].user.thisName[i],
        thisColour: result[2].user.thisColour[i]
    });
}

现在您拥有按地址分组的所有对象,您可以使用地址作为键从数组中的对象中检索它们。您还可以遍历locationsObjs对象的键以获取唯一的地址列表。所以:

for(var address in locationsObjs)
    if(locationsObjs.hasOwnProperty(address))
        // Plot marker using the address.