首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据时间获取最近的对象

根据时间获取最近的对象
EN

Stack Overflow用户
提问于 2019-06-25 10:29:12
回答 2查看 68关注 0票数 0

我在javascript中有两个对象数组:

第一个得到的是传感器获取的纬线。

代码语言:javascript
复制
{
    time : 'some timestamp',
    weigth : 1160
}

第二个得到另一个传感器获取的rfid。

代码语言:javascript
复制
{
    time : 'some timestamp',
    rfid : 'some rfid identifer'
}

对于获得的每个rfid标识符,我希望在获取数据时间之前和之后得到weigth。如果在rfid之后的数组中没有任何偏差,我就得到了一个未定义的值。

两个数组都按时间排序。

现在,我有了当前的代码:

代码语言:javascript
复制
var rfidNext = [];
for (var i = 0; i < this.acquiredData.rfid.length; i++)
{
    var weigths = this.acquiredData.weigthLitter;

    var currentRfid = this.acquiredData.rfid[i];
    var weigther = weigths.find(w => w.time > currentRfid.time);

    if (!weigther)
        rfidNext.push(currentRfid);
    else
        toSend.events.push({
            // Some logic here        
        });
}

这段代码似乎让我在rfid数据之后找到了正确的方法,但我找不到一种干净的方法来获取之前的数据。

编辑:数据示例

代码语言:javascript
复制
[ { time: 1561458881523, value: '1000 0000 0000 0001' },
  { time: 1561458882212, value: '1000 0000 0000 0001' },
  { time: 1561458883941, value: '1000 0000 0000 0002' } ]

[ { time: 1561458881182, value: 2130 },
  { time: 1561458881584, value: 1000 },
  { time: 1561458882789, value: 2130 },
  { time: 1561458884599, value: 3290 } ]

以这些数据为例:第一个rfid是在第一个和第二个被获取的魏格之间,这意味着动物从盒子里出来了,第二个rfid显示动物回来了,最后一个显示这个动物再次走高,而另一个rfid则让另一个动物进入盒子。

编辑:更大的数据集示例

代码语言:javascript
复制
[ { time: 1561469442605, value: '1000 0000 0000 0001' },
  { time: 1561469463263, value: '1000 0000 0000 0001' },
  { time: 1561469503038, value: '1000 0000 0000 0002' },
  { time: 1561469524312, value: '1000 0000 0000 0001' },
  { time: 1561469530073, value: '1000 0000 0000 0002' },
  { time: 1561469551351, value: '1000 0000 0000 0001' },
  { time: 1561469552085, value: '1000 0000 0000 0001' },
  { time: 1561469579144, value: '1000 0000 0000 0001' },
  { time: 1561469627817, value: '1000 0000 0000 0001' },
  { time: 1561469629525, value: '1000 0000 0000 0002' } ]

[ { time: 1561469394648, value: 1000 },
  { time: 1561469443257, value: 2130 },
  { time: 1561469463268, value: 1000 },
  { time: 1561469503679, value: 2160 },
  { time: 1561469524962, value: 3290 },
  { time: 1561469530073, value: 2130 },
  { time: 1561469551358, value: 1000 },
  { time: 1561469552740, value: 2130 },
  { time: 1561469579144, value: 1000 },
  { time: 1561469628430, value: 2130 },
  { time: 1561469630175, value: 3290 } ]

详细解释:

一开始,没有动物在1000岁的时候。

然后动物1进来了:2130年的西部

动物1出来: 1000度

动物2进入: weigth : 2160

动物1进入: 3290的西部

等等..。

所以我的目标是根据维格特的变化和rfid的读数来找出动物是在里面还是在外面。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-26 14:27:34

嗯,我终于用索引实现了这个目标(我觉得以前不考虑这个问题有点傻,但是,当你专注于你的想法时,有时很难得到另一个观点)。

代码语言:javascript
复制
    for (var i = 0; i < this.acquiredData.rfid.length; i++)
    {
        var weigths = this.acquiredData.weigthLitter;

        var currentRfid = this.acquiredData.rfid[i];
        var indexSup = weigths.findIndex(w => w.time >=  currentRfid.time);

        Log("RFID : " + currentRfid.value + "@" + currentRfid.time + " Before  :" + weigths[indexSup - 1].value+ "@" + weigths[indexSup - 1].time + " After :" + weigths[indexSup].value + "@" + weigths[indexSup].time);

        var evttype = weigths[indexSup - 1].value > weigths[indexSup].value ? 'exit' : 'entrance'; 
        toSend.events.push({
            type : evttype,
            bunnyId : currentRfid.value.toString(),
            value : currentRfid.time
        });

    }

在剩下的模拟中,我设法确保当我在代码的这一点时,数据就会完成。

票数 0
EN

Stack Overflow用户

发布于 2019-06-25 12:13:15

我试图解决您的场景,看看我迭代了rfid数据,找到了beforeafter timeweights。比较这些值,并依赖于将msgrfid推送到result数组的决策

代码语言:javascript
复制
var acquiredData = {
    weigthLitter: [
  { time: 1561458881182, value: 2130 },
  { time: 1561458881584, value: 1000 },
  { time: 1561458882789, value: 2130 },
  { time: 1561458884599, value: 3290 }],

rfid: [ { time: 1561458881523, value: '1000 0000 0000 0001' },
  { time: 1561458882212, value: '1000 0000 0000 0001' },
  { time: 1561458883941, value: '1000 0000 0000 0002' } ]
}

var { weigthLitter, rfid } = acquiredData

var result = rfid.reduce((acc, el, id)=> {
   var currentRfid = el.value;
   var after = weigthLitter.find(w => w.time > el.time);
   var before = weigthLitter.find(w => w.time < el.time);


    if(rfid[id-1] === undefined || (rfid[id-1] &&  rfid[id].value === rfid[id-1].value)){ // checking rfid is same or undefined 
        if (before.value > after.value) {
            acc.push({rfid: el.value, msg: "animal got out of the box" })
        } else {
            acc.push({rfid: el.value, msg: "animal came back in" })
        }
     } else {
           acc.push({rfid: el.value, msg: "another animal came back in" })
     }
     return acc
     }, [])

     console.log(result) //[{"rfid":"1000 0000 0000 0001","msg":"animal got out of the box"},{"rfid":"1000 0000 0000 0001","msg":"animal came back in"},{"rfid":"1000 0000 0000 0002","msg":"another animal came back in"}]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56751976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档