And*_*rei 0 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'}
]
Run Code Online (Sandbox Code Playgroud)
应该在地图上的新标记:
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'}
]
Run Code Online (Sandbox Code Playgroud)
因此,问题被简化为我想要找到解决方案的子任务:
更新对象数组 - 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'}
Run Code Online (Sandbox Code Playgroud)
只是为了重新陈述问题后评论中澄清的内容......
每个中的第一个元素markers
和newMarkers
值相等但不是参考,这很重要.因此,您需要newMarkers
更新列表中的所有项目,但如果元素newMarkers
具有与现有元素相同的所有属性值,markers
那么您希望保留原始元素markers
.
下面的解决方案循环遍历所有值newMarkers
,如果元素markers
具有相同的属性值,markers
则使用引用,否则使用newMarkers
引用.
const markers = [
{ 'lat':10, 'lng':10, 'type':'simple'},
{ 'lat':20, 'lng':20, 'type':'simple'},
{ 'lat':40, 'lng':40, 'type':'cluster'}
];
const 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'}
];
const updatedMarkers = newMarkers.map(newMarker =>
markers.reduce((accumulator, origMarker) => (
(
origMarker.lat === newMarker.lat &&
origMarker.lng === newMarker.lng &&
origMarker.type === newMarker.type
) ? origMarker : accumulator
), newMarker)
);
markers.map((marker, idx) => {
console.log(`Element #${idx} from markers is present: ${!!(updatedMarkers.indexOf(marker) + 1)}`);
});
newMarkers.map((marker, idx) => {
console.log(`Element #${idx} from newMarkers is present: ${!!(updatedMarkers.indexOf(marker) + 1)}`);
});
Run Code Online (Sandbox Code Playgroud)