0

我对 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(始终是结束日期,但绝不是开始日期)。

这就是为什么循环不是那么简单,要检查的条件很多。

4

1 回答 1

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]) 

你应该检查一下,如果你还没有在你的数组的最后一个元素。如果是这样 current[i+1] 是未定义的,那么辅助函数应该返回未定义。

然后,您可以将 firstMileStone 用作后备:

secondMileStone = getMileStone(current[i + 1]) || firstMileStone;

查看更新的小提琴(包括检查 getMileStone-Helperfunction):http: //jsfiddle.net/K37Fa/6/

于 2012-12-16T18:19:08.927 回答