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' 
});

これを達成するために関数を作成しようとしています。null の値を持つことができるのは epc、m1、または m2 だけですが、イベント範囲を作成する必要があるかどうか、およびイベント範囲をどこで終了する必要があるかを判断するには、条件を確認する必要があります。この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は単なるヘルパー関数なので、好きなように呼び出すことができます。例:current [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 に答える