格式化 JSON 以与现有 for/in 循环一起使用 Javascript

formatting JSON to work with existing for/in loop Javascript

希望我能在这个问题上得到一些帮助。首先,下面的代码工作正常。 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 放入包含其他 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]..." 并在我 运行 调试器时查看数据。但是每次我得到“未捕获的类型错误:无法读取未定义的属性't'。

感谢您的帮助!

我不确定您为什么会收到未定义的错误,但您的代码可以简化。您实际上只映射原始数据对象的条目,添加一个 运行 索引和 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 loop 直接获取原始数据的条目。这样,您就不需要 root[r] 使用密钥访问条目。