我有一种情况是在网状网络中跟踪蓝牙标签,我想知道在任何给定的时间点,标签最接近哪个nodeId
(嗅探器)(根据{值{1}}。
给出一个正在运行的数据窗口:
rssi
我的想法是我想从Mac上获取最新的3个读数,找到具有最高{ mac: '123', nodeId: 1, rssi: 1 }
{ mac: '456', nodeId: 2, rssi: 3 }
值的读数,并且仅当它改变了rssi
和{{1 }}从最后一个输出。我下面的代码几乎存在,但是当有多个mac地址时,事情开始变得混乱。
您能指出我的方向吗?我想我也需要按Mac分组?
nodeId
编辑 @Dorus太神奇了,并清理了所有内容,这似乎可以解决问题:
mac
答案 0 :(得分:0)
您当前的代码已接近,实际上我可以重用其中的大部分代码。
出问题的是,group.pipe(toArray())
仅在组完成时才发出(并且仅在源完成时才发生)。您想要做的是获取一个滑动窗口。您可以使用bufferCount(BUFFER_SIZE, 1)
进行操作。它将每1个项目发出最后3个项目,因此您可以在组每次获得新项目时检查最后3个项目。
const GROUP_BY = 'mac';
const DISTINCT_BY = 'nodeId';
const COMPARE_KEY = 'rssi';
const distinctComparer = field => (x, y) => x[field] === y[field];
const BUFFER_SIZE = 3;
const comparer = field => (a, b) => (a[field] < b[field] ? -1 : 1);
source.pipe(
groupBy(metric => metric[GROUP_BY])
mergeMap(grp => grp.pipe(
bufferCount(BUFFER_SIZE, 1)),
mergeMap(metric => from(metric).pipe(max(comparer(COMPARE_KEY))))
distinctUntilChanged(distinctComparer(DISTINCT_BY))
)
)
另外,我认为您想比较并获得小组中的最高人数。为此,您需要将所有内容放入处理单个组的mergeMap内。