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

Pro*_*Man 10 javascript firebase geofire angular

我正在使用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"}
Run Code Online (Sandbox Code Playgroud)

位置基本上是用于计算距离的纬度和经度数组,在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"}
Run Code Online (Sandbox Code Playgroud)

(可选)这是它存储这些位置的方式:

  ...
  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)
....
}
Run Code Online (Sandbox Code Playgroud)

确实,这个问题可能已经被问到,我一直在挖掘所有相似的问题,并发现了这些功能:

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)
Run Code Online (Sandbox Code Playgroud)

它不起作用我得到相同的重复列表.

2. arrUnique:

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);
Run Code Online (Sandbox Code Playgroud)

此外,它没有工作..

只有独特

  onlyUnique(value, index, self) { 
    return self.indexOf(value) === index;
  }

var newlist = list.filter(onlyUnique)
Run Code Online (Sandbox Code Playgroud)

不幸的是它不起作用......

这些是类似问题的一些答案,从数组中删除重复项,但没有一个工作.我不明白为什么他们不适合我的阵列类型,如果有人有想法或知道为什么会非常有帮助.

Ada*_*dam 3

您可以使用集合来存储和检查重复值。

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;
        }
    })   
}
Run Code Online (Sandbox Code Playgroud)

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