Преобразование данных JSON в новый вывод JSON - PullRequest
0 голосов
/ 05 июля 2019

Я пытаюсь написать скрипт для вывода 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)

1 Ответ

0 голосов
/ 05 июля 2019

Позвольте мне быть смелым и попытаться ответить, просто взглянув на код;пожалуйста, попробуйте это:

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)
    {
      if (current_excursion['type']==null)
      {
          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'])
      }
    }
    else    // this is where the second 'if' was
    {
      if (current_excursion['type']!=null)
      {
          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)
      }
    }
  }
...