格式化JSON以使用现有for/in-loop Javascript

格式化JSON以使用现有for/in-loop Javascript,javascript,json,for-in-loop,Javascript,Json,For In Loop,希望我能在这个问题上得到一些帮助。首先,下面的代码工作正常。JSON是从一个只包含此JSON的文件中读入的,For-in循环对其进行迭代并填充而不产生任何问题 { "ID:1": { "employee": "Mike", "start": { "t": "2018-08-01", "v": 28 }, "end": { "t": "2018-08-14", "v": 39 } }, "ID:2": { "employee": "John

希望我能在这个问题上得到一些帮助。首先,下面的代码工作正常。JSON是从一个只包含此JSON的文件中读入的,For-in循环对其进行迭代并填充而不产生任何问题

{

"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放入一个包含其他JSON对象的较大blob中。所以,我需要这样格式化它:

"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]…”,并在运行调试器时查看数据。但每次我得到“UncaughtTypeError:无法读取未定义的属性't'


感谢您的帮助!

我不确定您为什么会出现未定义的错误,但您的代码可以简化。您实际上只映射原始数据对象的条目,添加运行索引和
更改
属性。使用
对象.值
()可以按如下方式完成:

const数据={
“ID:1”:{
“雇员”:“迈克”,
“开始”:{
“t”:“2018-08-01”,
“v”:28
},
“结束”:{
“t”:“2018-08-14”,
“v”:39
}
},
“ID:2”:{
“雇员”:“约翰”,
“开始”:{
“t”:“2018-08-01”,
“v”:43
},
“结束”:{
“t”:“2018-08-14”,
“v”:35
}
},
};
const convert=(数据)=>{
const employees=Object.values(数据)
.map({employee,start,end},index)=>({
id:索引,
雇员,,
开始
完,,
更改:Math.abs(start.v-end.v)
}));
返回{雇员};
};

console.log(convert(data))
为什么不调用
get_data(root.employees,r_scale)
而不对函数进行任何更改?Igor,谢谢!尽管这会引发一个错误,但它让我想到在for in参数中附加for(r in root.employees)“它就像一个符咒。这是一个更好的方式去做这件事!我继承了这个代码库,所以我正在慢慢推进并合并成一个更大的blob。比起其他选择,我更喜欢现在的地图。我以后一定会用这个。再次感谢。