从另一个数组

时间:2017-02-10 01:16:03

标签: javascript arrays algorithm leaflet lodash

我的主要任务是更新地图上的标记。

符号

在地图上实时显示的标记

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数组执行以下操作:

  1. markers中删除不在newMarkers中的对象(由三个属性进行比较:latlngtype)。
  2. 如果不存在,则将newMarkers中的对象添加到markers中(按latlng进行比较)。如果标记存在(由两个属性:latlng),则需要对其进行更新,即替换为newMarkers中的新标记。
  3. 我的解决方案无效,因为它是因为它在大量标记上执行了很长时间。

    更新后的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'}
    

2 个答案:

答案 0 :(得分:5)

重新陈述问题后评论中澄清的内容......

每个markersnewMarkers中的第一个元素相等,但不是引用,这很重要。因此,您需要更新列表中newMarkers的所有项目,但如果newMarkers中的元素与markers中已存在的元素具有相同的属性值,那么您希望保留来自markers的原始元素。

下面的解决方案循环遍历newMarkers中的所有值,如果markers中的元素具有相同的属性值,则使用markers引用,否则{{1}使用了引用。

newMarkers

答案 1 :(得分:2)

如果我正确理解您的问题,您希望反映newMarkersmarkers的更改,而不是简单地替换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));