JavaScript重新格式化JSON数组

时间:2012-12-16 17:56:59

标签: javascript json

我对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(始终是结束日期但从未开始日期)到达。

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

1 个答案:

答案 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/