先说一下,当初做这个的初衷:
其实是最近在一个高德地图的我的项目。咱们有一个需要是用户能够看到本人的口头轨迹。
这里的口头轨迹其实就是在地图上画折线。new AMap.Polyline() 相似的这样的一个实例。重点来了,该实例外面有一个须要传参的是一个对象,对象外面有一个 path 属性,他须要传的是以经纬度为数组的一个二维数组,而后他再绘制成折线。例如:var lineArr = [[116.478800,39.997461],[116.478935,39.997561],[116.478935,39.997761],[116.478939,39.997825],[116.478912,39.998549],[116.478912,39.998549],[116.478998,39.998555],[116.478998,39.998555],[116.479282,39.99856],[116.479658,39.998528],[116.480151,39.998453],[116.480784,39.998302],[116.480784,39.998302],[116.481149,39.998184],[116.481573,39.997997]]
而后咱们这边需要是隔 60 秒获取用户以后的经纬度。而后我前端这边做了一层过滤,判断用户是否没动,没动的话 以后经纬度不传到数据库去。然而有一个问题。小弟本地应用的是 google 浏览器,用的是 IP 定位。就是如果用户从新关上利用他以后的经纬度还是不变的话,再后盾没有做校验的状况下,后盾数据其实是有反复。所以我这边进行了二维数组去重。
起初想了一个下午,没想到好的解决的方法。只停留在 ES6 的 new Set 能够实现数组去重,但不晓得它的原理。而且 new Set 也有局限性就是无奈去重子项为复合数据类型的。起初看到一篇文章,茅塞顿开。转而我再进行了加工,使得更多的数据类型能够去重。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
//ES5 实现数组去重,**** 参考他人的 ******
var array = [1, '1', 1, 2, 3, 2, 4];
var tmpObj = {};
var result = [];
array.forEach(function(a) {var key = (typeof a) + a;
if (!tmpObj[key]) {tmpObj[key] = true;
result.push(a);
}
});
//ES5 二维数组去重子数组或者对象亦或其余根本数据类型,**** 本人想的 ******
var arr = [[11,15],[14.67,11.89],[23.44,56.78],[90.89,78.90],[11,15],{a:44,b:'555'},[90.89,78.90],[14.67,11.89],['op',/s+/g],{a:44,b:'555'},'256',
'556',89,98,'256',89,89,'556',98,null,null,undefined,undefined,NaN,NaN,function a(){},function a(){},/s+/g,/s+/g
];
var tmpObj2 = {};
var res = [];
arr.forEach(function(item){if(!(item === undefined || item === null)){if(Object.prototype.toString.call(item) === '[object object]'){// 因为是对象应用 toString 办法返回的是 [object object], 无奈精密解析外面的内容,所以这里应用 JSON.stringify 代替
var key = (typeof item) + JSON.stringify(item);
}else{
// 其余数据类型都能够被 toString 精密地转成字符串。null 和 undefined 没有 toString 办法。var key = (typeof item) + item.toString();}
if(!tmpObj2[key]){tmpObj2[key] = true;
res.push(item);
}
}
})
console.log(res);
</script>
</body>
</html>
多说点。
如果你要做高德地图 web 我的项目要小心以下几个坑点:
1.ios10 及以上,以及谷歌浏览器必须将网站升到 https 能力精确定位。
2.JS-API 的 Geolocation 定位插件,交融了 HTML5 Geolocation 定位接口、准确 IP 定位服务,以及安卓定位 sdk 定位。其中与安卓定位 sdk 的联合应用实用于开发安卓零碎的 H5 利用,需同时应用安卓定位 sdk 和 JS-API。
3. 高德地图无奈兼容所有浏览器。例如上次用华为浏览器测试,地图就没法渲染。
4. 当应用浏览器的 IP 定位时,并且本身连着 WIFI 状况下,Geolocation 定位插件会依据以后用户沉闷多的区域进行定位。
(其实这就是局部网上网友反映的定位不准,另一部分指的是真机每次定位的时候的偏差,可能就几十米样子。)
说得太多了。
因为数组去重是借鉴他人的,所以这里贴一下他人的网址。还有贴一下高德的。
https://www.cnblogs.com/think…
https://lbs.amap.com/api/java…