Получить ближайшие объекты по времени - PullRequest
0 голосов
/ 25 июня 2019

У меня есть два массива объектов в JavaScript:

первый получает вес, полученный датчиком

{
    time : 'some timestamp',
    weigth : 1160
}

второй получает RFID, полученный другим датчиком

{
    time : 'some timestamp',
    rfid : 'some rfid identifer'
}

Для каждого полученного идентификатора RFID я хочу получить вес до и после полученного времени данных. И если у меня нет веса в массиве, полученном после RFID, я получил неопределенное значение.

Оба массива отсортированы по времени.

На данный момент у меня есть текущий код:

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-данных, но я не могу найти чистый способ получить тот, который был раньше.

Редактировать: пример данных

[ { 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 берется между первым и вторым полученным весом, что означает, что животное вылезло из коробки, 2 RFID показывает, что животное вернулось, а последнее показывает, что животное вес снова становится выше, с другим RFID, так что в коробке появилось другое животное.

Редактировать: Пример с большим набором данных

[ { 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 попадает в: вес: 2160

животное 1 попадает в: вес 3290

и так далее ...

Поэтому моя цель - выяснить, попадает ли животное внутрь или наружу в соответствии с вариацией веса и показаниями RFID.

Ответы [ 2 ]

1 голос
/ 25 июня 2019

Я попытался решить ваш сценарий, посмотрите на него, я перебрал данные rfid, найдите before и after time и weights.Сравнил значения и в зависимости от решения выдвинул msg и rfid в result массив

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"}]
0 голосов
/ 26 июня 2019

Что ж, мне наконец-то удалось добиться этого таким образом, используя индекс (я чувствовал себя немного глупо, если не думал об этом раньше, но хорошо, когда вы сосредоточены на своей идее, иногда трудно получить другую точку зрения)

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

    }

И мне удается быть уверенным в остальной части симуляции, что данные будут полны, когда я нахожусь в этой точке кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...