我的主要任务是更新地图上的标记。
符号:
在地图上实时显示的标记:
var markers = [
{ 'lat':10, 'lng':10, 'type':'simple'},
{ 'lat':20, 'lng':20, 'type':'simple'},
{ 'lat':40, 'lng':40, 'type':'cluster'}
]
应该在地图上的新标记:
var newMarkers = [
{ 'lat':10, 'lng':10, 'type':'simple'},
{ 'lat':20, 'lng':20, 'type':'simple'},
{ 'lat':30, 'lng':30, 'type':'simple'},
{ 'lat':50, 'lng':50, 'type':'simple'}
]
因此问题被简化为子任务,我想找到解决方案:
更新对象数组 - markers
来自另一个对象数组 - newMarkers
。
因此,需要使用markers
数组执行以下操作:
markers
中删除不在newMarkers
中的对象(由三个属性进行比较:lat
,lng
,type
)。 newMarkers
中的对象添加到markers
中(按lat
,lng
进行比较)。如果标记存在(由两个属性:lat
,lng
),则需要对其进行更新,即替换为newMarkers
中的新标记。我的解决方案无效,因为它是因为它在大量标记上执行了很长时间。
更新后的markers
数组应如下所示:
console.log(markers)
{ 'lat':10, 'lng':10, 'type':'simple'},
{ 'lat':20, 'lng':20, 'type':'simple'},
{ 'lat':30, 'lng':30, 'type':'simple'},
{ 'lat':50, 'lng':50, 'type':'simple'}
答案 0 :(得分:5)
重新陈述问题后评论中澄清的内容......
每个markers
和newMarkers
中的第一个元素相等,但不是引用,这很重要。因此,您需要更新列表中newMarkers
的所有项目,但如果newMarkers
中的元素与markers
中已存在的元素具有相同的属性值,那么您希望保留来自markers
的原始元素。
下面的解决方案循环遍历newMarkers
中的所有值,如果markers
中的元素具有相同的属性值,则使用markers
引用,否则{{1}使用了引用。
newMarkers
答案 1 :(得分:2)
如果我正确理解您的问题,您希望反映newMarkers
中markers
的更改,而不是简单地替换markers
上的引用。
// remove (everything in markers that's not in newMarkers) from markers
_.pull(markers, ..._.difference(markers, newMarkers));
// push (everything in newMarkers that's not in markers) to markers
markers.push(..._.difference(newMarkers, markers));