javascript - 从 GeoFire 对象数组中删除重复项

标签 javascript angular firebase 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"}

Location 基本上是一个用来计算距离的经纬度数组,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。 RemoveDuplicates()

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;
        }
    })   
}

请记住,使用此方法可能会删除距离相同但坐标不同的结果。如果这会给您带来问题,那么您还需要检查纬度/经度对。

关于javascript - 从 GeoFire 对象数组中删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52480479/

相关文章:

javascript - 如何通过异步操作维护订阅者的顺序

swift - 将选项卡栏项目设置为自定义图像,例如 Instagram

javascript - 在 jQuery 中单击按钮

javascript - 为什么 rxjs 6 弹珠文档说 "--(abc)-|"在第 8 帧完成?

javascript - 使用ngx-print打印图像的问题

javascript - .Net Core 2 SPA/Angular 模板 - 渲染全局 CSS

ios - 适用于 iOS 9.0 及更高版本的 Firebase 动态链接无法使用对象 FIRDynamicLink 对象获取 URL。它给零值

firebase - 我应该使用 Firebase 动态链接而不是通用链接和应用链接吗?

javascript - 根据 JS/Jquery 中的其他下拉菜单更改 FORM SELECT(下拉菜单)

javascript - 在 html 中清除链接的 css 属性