форматирование JSON для работы с существующим циклом for / in Javascript - PullRequest
0 голосов
/ 25 августа 2018

надеюсь, я смогу помочь с этим вопросом. Во-первых, приведенный ниже код работает нормально. JSON считывается из файла, который содержит только этот JSON, цикл For in Loop итерирует его и заполняет без проблем.

{

"ID:1": {
  "employee": "Mike",
  "start": {
    "t": "2018-08-01",
    "v": 28
  },
  "end": {
    "t": "2018-08-14",
    "v": 39
  }
},
"ID:2": {
  "employee": "John",
  "start": {
    "t": "2018-08-01",
    "v": 43
  },
  "end": {
    "t": "2018-08-14",
    "v": 35
  }
},
}


function get_data(root,r_scale){

var my_data = [],
x=0;

for (r in root){
  start_t = root[r]['start'].t
  start_v = root[r]['start'].v
  end_t = root[r]['end'].t
  end_v = root[r]['end'].v
  change = Math.abs(start_v - end_v)
  my_data.push({
   change: change,
   id: x, 
   employee: root[r].employee, 
   start_t: start_t, 
   start_v: start_v,
   end_t: end_t,
   end_v: end_v
  })
  x = x + 1
  }

  return my_data

  };

К сожалению, мне нужно поместить вышеупомянутый JSON в больший BLOB-объект, содержащий другие объекты JSON. Итак, мне нужно отформатировать его так:

"employees": [

  {
    "ID": 1,
    "employee": "Mike",
    "start": {
      "t": "2018-08-01",
      "v": 28
    },
    "end": {
      "t": "2018-08-14",
      "v": 39
    }
  },


  {
    "ID": 2,
    "employee": "John",
    "start": {
      "t": "2018-08-01",
      "v": 43
    },
    "end": {
      "t": "2018-08-14",
      "v": 35
    }
  }

]

Я не могу заставить эту работу. Я могу добавить «.employees» к корневому каталогу «root.employees [r] ...» в цикле и посмотреть данные при запуске отладчика. Но каждый раз, когда я получаю "uncaught TypeError: Не могу прочитать свойство 't' из неопределенного.

Спасибо за любую помощь!

1 Ответ

0 голосов
/ 25 августа 2018

Я не уверен, почему вы получаете неопределенные ошибки, но ваш код может быть упрощен.На самом деле вы отображаете только записи исходного объекта данных, добавляете текущий индекс и свойство change.Это можно сделать следующим образом, используя Object.values ( MDN ):

const data = {

"ID:1": {
  "employee": "Mike",
  "start": {
    "t": "2018-08-01",
    "v": 28
  },
  "end": {
    "t": "2018-08-14",
    "v": 39
  }
},
"ID:2": {
  "employee": "John",
  "start": {
    "t": "2018-08-01",
    "v": 43
  },
  "end": {
    "t": "2018-08-14",
    "v": 35
  }
},
};

const convert = (data) => {
  const employees = Object.values(data)
  .map(({ employee, start, end }, index) => ({ 
    id: index, 
    employee, 
    start, 
    end, 
    change: Math.abs(start.v - end.v) 
  }));
  return { employees };
};


  console.log(convert(data))

Обратите внимание, что вы также могли напрямую получить записи ваших исходных данных, используя цикл for-of .Таким образом, вам не понадобится root[r] для доступа к записям с помощью клавиш.

...