我对JSON表示法比较陌生,在尝试重新格式化时遇到了问题。需要将数据库中包含的当前格式修改为新格式,以便导入项目时间线图。
以下是当前的JSON格式:
[
{
"name":"5-HP-N/A-N/A-F8",
"node":{
"name":"5",
"id":14
},
"timeline":{
"epc":null,
"m1":null,
"m2":null,
"m3":1554087600000,
"m4":1593572400000,
"m5":1625108400000,
"m6":1641006000000,
"m7":1656644400000
},
"fab":{
"name":"F8",
"id":1
}
},
但是,为了在图表中显示,我需要以下格式:
{
'start': new Date(value from epc, or first non-null milestone),
'end': new Date(value from m1 or first non-null milestone), // end is optional
'content': 'label from start Date milestone'
'group' : ' value from name field above 5-HP'
'classname' : ' value from start Date milestone'
});
我正在尝试编写一个函数来完成此任务。只有epc,m1或m2可以具有null值,但必须检查条件以确定是否应创建事件范围以及应该在何处结束。重新格式化这个json数据的最佳方法是什么(最好是从外部json表中)?
编辑:感谢所有帮助,我看到它现在如何运作!我相信我第一次没有很好地解释,但实际上每个“组”需要多个课程项目。
最终结果是这些将在时间轴图“组”行上显示内联,因此我试图弄清楚如何在每个数组元素上创建多个新对象。
从技术上讲,第一个将有开始日期= m3,结束日期= m4。然后,下一个对象将具有与第一个对象相同的组(5-HP ...),开始日期= m4,结束日期= m5 ......等。这将持续到m7(始终是结束日期但从未开始日期)到达。
这就是为什么循环不是那么简单,需要检查的条件很多。
答案 0 :(得分:1)
在这里看到一个工作小提琴:http://jsfiddle.net/K37Fa/
你的输入数据似乎是一个数组,所以我围绕它建立一个循环。如果不是只看到这个小提琴,其中输入数据是一个简单的对象:http://jsfiddle.net/K37Fa/1/
var i
, result = [],
, current
, propCounter
, content = [ { "name":"5-HP-N/A-N/A-F8", "node":{ "name":"5", "id":14 }, "timeline":{ "epc":null, "m1":null, "m2":null, "m3":1554087600000, "m4":1593572400000, "m5":1625108400000, "m6":1641006000000, "m7":1656644400000 }, "fab":{ "name":"F8", "id":1 } }],
// get the milestone in a function
getMileStone = function(obj) {
propCounter = 1;
for(propCounter = 1; propCounter <= 7; propCounter++) {
// if m1, m2 and so on exists, return that value
if(obj.timeline["m" + propCounter]) {
return {key: "m" + propCounter, value: obj.timeline["m" + propCounter]};
}
}
};
// loop over content array (seems like you have an array of objects)
for(i=0;i< content.length;i++) {
current = content[i];
firstMileStone = getMileStone(current);
result.push({
'start': new Date(current.epc || firstMileStone.value),
'end': new Date(current.m1 || firstMileStone.value),
'content': firstMileStone.key,
'group' : current.name,
'classname' : firstMileStone.value
});
}
编辑: getMileStone只是一个帮助函数,所以你可以随意调用它。例如当前第[i + 1]:
secondMileStone = getMileStone(current[i + 1])
如果您还没有在数组的最后一个元素处,那么您应该检查一下。如果是,则当前[i + 1]未定义,并且辅助函数应返回undefined。
然后你可以使用firstMileStone作为后备:
secondMileStone = getMileStone(current[i + 1]) || firstMileStone;
查看更新的小提琴(包括检查getMileStone-Helperfunction):http://jsfiddle.net/K37Fa/6/