格式化 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]
使用密钥访问条目。
希望我能在这个问题上得到一些帮助。首先,下面的代码工作正常。 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]
使用密钥访问条目。