Я пытаюсь написать скрипт для вывода JSON в соответствии с этими ограничениями.
Пока что я думаю, что моя логика верна.
Любая помощь приветствуется.
ТЕКУЩИЕ ВОПРОСЫ:
- [ работает сейчас ] Я не могу понять, почему длительность продолжает возвращаться 0
- [ работает сейчас ] как заняться настройкой
max/min
- решение вопроса о том, как справляться, когда две экскурсии разных типов происходят вплотную («горячая» ⇒ «холодная» или «холодная» ⇒ «горячая»)
Вот так должен выглядеть каждый новый объект
let current_excursion = {
'device_sensor' : '',
'start_at' : [],
'stop_at' : 0,
'duration' : 0,
'type': '',
'max/min':0
}
device_sensor
sId
эта экскурсия была обнаружена.
start_at
Дата и время, когда температура сначала выходит за пределы диапазона ISO_8601 format
.
stop_at
Дата и время, когда температура вернулась в диапазон ISO_8601 format
.
продолжительность
Общее время в секундах, когда температура была вне диапазона.
Тип
Строка «горячая» или «холодная» в зависимости от типа экскурсии.
макс / мин
Температура экстремальная для экскурсии. Для «горячей» экскурсии это будет максимум, а для «холодной» - мин.
Начинается температурный экскурс
когда температура выходит за пределы диапазона и заканчивается, когда температура возвращается
в ассортимент.
Для «горячей» экскурсии это когда температура превышает 8 ° C,
и для «холодной» экскурсии это когда температура ниже 2 ° C.
Если две экскурсии разных типов происходят спина к спине
(«Горячий» ⇒ «холодный» или «холодный» ⇒ «горячий») выберите среднюю точку двух
временные метки как конец первой экскурсии и начало второй.
Если экскурсия происходит в конце показаний температуры
пожалуйста, закончите экскурсию при последнем чтении (продолжительность = 0)
Вот ссылка на данные теста
Данные тестового примера
Вот что я написал до сих пор:
const tempTypeTernary = (num) =>{
if(num < 2){
return 'cold'
} else if(num > 8){
return 'hot'
}
}
const excursion_duration = (x,y) =>{
let start = new Date(x) / 1000
let end = new Date(y) / 1000
return end - start
}
const reset_excursion = (obj) => {
Object.keys(obj).map(key => {
if (obj[key] instanceof Array) obj[key] = []
else obj[key] = ''
})
}
const list_excursion = (array) =>{
let result = [];
let max_min_excursion = 0;
let current_excursion = {
'device_sensor' : '',
'start_at' : [],
'stop_at' : 0,
'duration' : 0,
'type': '',
'max/min':0
}
for(let k = 0; k < array.length;k++){
if( array[k]['tmp'] < 2 || array[k]['tmp'] > 8){
current_excursion['device_sensor'] = array[k]['sId'];
current_excursion['start_at'] = [new Date(array[k]['time']).toISOString(),array[k]['time']];
current_excursion['type'] = tempTypeTernary(array[k]['tmp']);
if( array[k]['tmp'] > 2 || array[k]['tmp'] < 8){
current_excursion['stop_at'] = new Date(array[k]['time']).toISOString();
current_excursion['duration'] = excursion_duration(current_excursion['start_at'][1],array[k]['time'])
}
result.push(current_excursion)
reset_excursion(current_excursion)
}
}
return result
}
list_excursion(json)