gpt4 book ai didi

angular - 如何使用 RXJS 运算符根据重复值对 Firebase 可观察列表进行排序

转载 作者:太空狗 更新时间:2023-10-29 19:26:52 26 4
gpt4 key购买 nike

我正在使用 rxjs 运算符来处理 firebase 可观察列表。我需要根据重复值(特定 ID)对不同列表进行排序。

这是我的代码:

  this.places$
.flatMap((x)=>{
console.log(x)
return x;
})
.distinct((places:any)=>{
console.log(places.googleId)
return places.googleId;
})
.subscribe(snap=>{
this.tempArray.push(snap);
})

这是 (places.googleId) 的日志

enter image description here

所以我需要根据最重复的数字对这个 id 或列表进行排序,例如

    1-Eg9MZWJhbm9uLCBCZWlydXQ 
2-EhZIYW1yYSwgQmVpcnV0LCBMZWJhbm9u
3-ChIJR9lei8pAHxUREmilQojBkYc

请帮忙,

谢谢

最佳答案

我将采用的基本方法是使用计数器排序来减少数组。我假设您只希望最后有一个值代表整个流的排序结果。所以我添加了 last 运算符来等待完成。

如果你想用 RxJs 做到这一点,那么你可以使用 scan 运算符来减少流,然后在 map 运算符中对其进行排序。

function countDistinct(map, current) {
let entry = map.get(current.id);
if (!entry) {
entry = {
count: 0,
data: current
};
map.set(current.id, entry);
}
entry.count++;
return map;
}

function sortCountDescending(a, b) {
return a.count < b.count ? 1
: a.count > b.count ? -1
: 0;
}

Rx.Observable.of([
{ id: 1},
{ id: 2},
{ id: 3},
{ id: 2},
{ id: 2},
{ id: 3}
])
.flatMap(x => x)
.scan(countDistinct, new Map())
.last() // remove this if you want a progressive result
.map(x => Array.from(x.values()).sort(sortCountDescending).map(x => x.data))
.subscribe(x => { console.log(x); });
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.6/Rx.js"></script>

编辑:您可以使用 reduce 运算符代替 .scan(...).last()。它基本上做同样的事情。

关于angular - 如何使用 RXJS 运算符根据重复值对 Firebase 可观察列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48522124/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com