javascript - 从 GeoFire 对象数组中删除重复项
问题描述
我正在使用 Angular 6 上的 Geofire 和 Firebase 来存储位置,不幸的是它存储了很多重复项,这是一个示例(控制台记录我的变量currentHits):
0: {location: Array(2), distance: "48.84", url: "assets/imgs/fix.png"}
1: {location: Array(2), distance: "48.84", url: "assets/imgs/fix.png"}
2: {location: Array(2), distance: "48.84", url: "assets/imgs/fix.png"}
3: {location: Array(2), distance: "48.85", url: "assets/imgs/free.png"}
4: {location: Array(2), distance: "48.85", url: "assets/imgs/free.png"}
5: {location: Array(2), distance: "48.85", url: "assets/imgs/free.png"}
6: {location: Array(2), distance: "48.87", url: "assets/imgs/low.png"}
7: {location: Array(2), distance: "48.87", url: "assets/imgs/low.png"}
8: {location: Array(2), distance: "48.87", url: "assets/imgs/low.png"}
位置基本上是一个用于计算距离的纬度和经度数组,在id 0、1和2中其坐标相同,3,4和5也相同,...
这就是我想要得到的:
0: {location: Array(2), distance: "48.84", url: "assets/imgs/fix.png"}
1: {location: Array(2), distance: "48.85", url: "assets/imgs/free.png"}
2: {location: Array(2), distance: "48.87", url: "assets/imgs/low.png"}
(可选)这是它存储这些位置的方式:
...
hits = new BehaviorSubject([])
...
queryHits(...){
....
let hit = {
location: location,
distance: distance.toFixed(2),
url:img
}
let currentHits = this.hits.value
currentHits.push(hit)
this.hits.next(currentHits)
....
}
确实,这个问题可能已经被问过了,我一直在挖掘所有类似的问题并发现了这些功能:
1. 删除重复项()
function removeDuplicates(arr){
let unique_array = []
for(let i = 0;i < arr.length; i++){
if(unique_array.indexOf(arr[i]) == -1){
unique_array.push(arr[i])
}
}
return unique_array
}
var newlist = removeDuplicates(list)
它没有用,我得到了相同的重复列表。
2.arr独特:
function arrUnique(arr) {
var cleaned = [];
arr.forEach(function(itm) {
var unique = true;
cleaned.forEach(function(itm2) {
if (_.isEqual(itm, itm2)) unique = false;
});
if (unique) cleaned.push(itm);
});
return cleaned;
}
var newlist= arrUnique(list);
还有,也没用。。
3.唯一唯一
onlyUnique(value, index, self) {
return self.indexOf(value) === index;
}
var newlist = list.filter(onlyUnique)
不幸的是它没有工作......
这些是对从数组中删除重复项的类似问题给出的一些答案,但没有一个有效。我不明白为什么它们不适用于我的数组类型,如果有人有想法或知道为什么会非常有帮助。
解决方案
您可以使用集合来存储和检查重复值。
const removeDuplicates = arr => {
let matches = new Set();
return arr.filter(elem => {
const {distance} = elem;
if(matches.has(distance)){
return false;
} else {
matches.add(distance);
return true;
}
})
}
请记住,使用这种方法,您可能会删除距离相同但坐标不同的结果。如果这给您带来了问题,那么您还需要检查 lat/lng 对。
推荐阅读
- excel - 将 Excel 行变成列
- mysql - 更新查询执行超过 75 分钟
- javascript - 警告:console.timeEnd() 没有这样的标签“响应时间”
- angular - 在 Angular NgFor NgStyle 中显示引导类
- react-native - 为什么 App.js 中的异步函数在初始化时返回 undefined
- angular - 编译期间缺少 css sourcemap,但 sourcemap 与 css 位于同一文件夹中
- c# - 查找距离较近 1 像素的点数
- r - 将 XML 导入 R
- javascript - Redux - Reducer 中的异常导致存储损坏
- html - 仅使用 CSS 删除最后一页的页脚