簡體   English   中英

JavaScript重新格式化JSON數組

[英]JavaScript Reformatting JSON arrays

我是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(始終是結束日期,但永遠不會是開始日期)為止。

這就是為什么循環不是那么簡單,要檢查許多條件的原因。

在此處查看有效的提琴: 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只是一個輔助函數,因此您可以隨便調用它。 例如current [i + 1]:

secondMileStone = getMileStone(current[i + 1]) 

您應該檢查一下是否還沒有到達數組的最后一個元素。 如果是,則current [i + 1]未定義,並且helper函數應返回未定義。

然后,您可以將firstMileStone用作備用:

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

查看更新的小提琴(包括在getMileStone-Helper函數中進行檢查): http : //jsfiddle.net/K37Fa/6/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM