2016-11-12 16 views
0

jsonオブジェクトを別のjsonオブジェクトに再帰的に変換する際に助けが必要です。jsonオブジェクトを再帰的に変換する

私の入力オブジェクトは、次のようになります。

var my_obj = { 
    "id": 22, 
    "eventTypeId": 37, 
    "eventTypeName": "CommonOnly", 
    "parentEvent": { 
    "id": 21, 
    "eventTypeId": 35, 
    "eventTypeName": "FullTest", 
    "parentEvent": { 
     "id": 20, 
     "parentEvent": null, 
     "eventTypeId": 38, 
     "eventTypeName": "FullTest" 
    } 
    }, 
    "childrenEvents": [ 
    { 
     "id": 24, 
     "parentEventId": 22, 
     "eventTypeId": 36, 
     "eventTypeName": "BlindedTest", 
     "childrenEvents": [] 
    }, 
    { 
     "id": 23, 
     "parentEventId": 22, 
     "eventTypeId": 38, 
     "eventTypeName": "OneCustom", 
     "childrenEvents": [] 
    } 
    ] 
} 

私が欲しいの出力は次のようになります。

var my_obj = { 
"id": 20, 
"eventTypeId": 38, 
"parentEvent": null, 
"eventTypeName": "FullTest", 
"childrenEvents": [{ 
    "id": 21, 
    "eventTypeId": 35, 
    "eventTypeName": "FullTest", 
    "childrenEvents": [ 
     { 
      "id": 22, 
      "eventTypeId": 37, 
      "eventTypeName": "CommonOnly", 
      "childrenEvents": [ 
       { 
        "id": 24, 
        "parentEventId": 22, 
        "eventTypeId": 36, 
        "eventTypeName": "BlindedTest", 
        "childrenEvents": [] 
       }, { 
        "id": 23, 
        "parentEventId": 22, 
        "eventTypeId": 38, 
        "eventTypeName": "OneCustom", 
        "childrenEvents": [] 
       } 
      ] 
     } 
    ] 
}] 

}

だから私は二parentEventオブジェクトを取得できるようにしたいですparentEvent = nullは配列childrenEventsでルート要素になりました。子配列内では、それ自身のを持つ最初の親イベントオブジェクトになりますこの配列の配列とその内部に既存のルートオブジェクトを入れたいchildrenEvents配列

誰かが私にそれを解決するのを手伝っていただけると感謝します。前もって感謝します。

私の試み

function rebuild(input) 
{ 
    var childrenEvents = [] ; 

    for (f in input.parentEvent) // we may have attributes other than "age" 
    if (f.parentEvent == null) { 
     f.parentEvent.push(childrenEvents); 
    } 
    else { 
      f.parentEvent.push(input.parentEvent[f]); 
    } 

    if (input.childrenEvents.length !== 0) 
    { 
     input.parentEvent[f].push(input.childrenEvents) 
    } 

    return input; 
} 

    console.log(rebuild($scope.myObj)) 

}); 

plunker

+1

それ以外の場合は、ちょうどあなたが誰かがあなたのためにこれをコーディングすることを期待のように見え、SOコードの書き込みサービスではありません....あなたはそれが動作していない試みているものをご提示ください – charlietfl

+0

@charlietflカップルミニにしましょう – antonyboom

+0

@charlietfl更新情報を確認してください – antonyboom

答えて

3

多分これに近い何か(それを実行していません)... 。

var my_obj = { "id": 22, "eventTypeId": 37, "eventTypeName": "CommonOnly", "parentEvent": { "id": 21, "eventTypeId": 35, "eventTypeName": "FullTest", "parentEvent": { "id": 20, "parentEvent": null, "eventTypeId": 38, "eventTypeName": "FullTest" } }, "childrenEvents": [{ "id": 24, "parentEventId": 22, "eventTypeId": 36, "eventTypeName": "BlindedTest", "childrenEvents": [] }, { "id": 23, "parentEventId": 22, "eventTypeId": 38, "eventTypeName": "OneCustom", "childrenEvents": [] }] }, 
 
    tree = function (data, root) { 
 
     function iter(a) { 
 
      var parent; 
 
      if (a.childrenEvents && Array.isArray(a.childrenEvents)) { 
 
       a.childrenEvents.forEach(iter); 
 
      } 
 
      a.childrenEvents = o[a.id] && o[a.id].childrenEvents; 
 
      o[a.id] = a; 
 
      if (a.parentEvent === root) { 
 
       r = a; 
 
      } else { 
 
       if (a.parentEvent && 'id' in a.parentEvent) { 
 
        parent = a.parentEvent.id; 
 
       } 
 
       if ('parentEventId' in a) { 
 
        parent = a.parentEventId; 
 
       } 
 
       if (parent !== undefined) { 
 
        o[parent] = o[parent] || {}; 
 
        o[parent].childrenEvents = o[parent].childrenEvents || []; 
 
        o[parent].childrenEvents.push(a); 
 
       } 
 
      } 
 
      if (a.parentEvent) { 
 
       iter(a.parentEvent); 
 
       delete a.parentEvent; 
 
      } 
 
     } 
 

 
     var r, o = {}; 
 
     iter(data); 
 
     return r; 
 
    }(my_obj, null); 
 

 
console.log(tree);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

私は解決策からは絶対に遠いです...時間が来ることを願っています。ありがとう、私はそれを感謝します。 – antonyboom

-1

あなたの質問のタイトルは「再帰的」と言うが、あなたのコード内で(私が見ることができる)は再帰はありません。あなたはrebuild() ...内からrebuild()に電話する必要があります。あなたはすべての依存関係を構築し、ツリーとして

parentEvent === null 

で一つだけを取るためにオブジェクトを使用することができ

function rebuild(input) { 

    var rslt = input; // If it stays this way, we've reached the end of the line 

    var parent = inpt.parentEvent; 
    if (parent) { 
     parent.childrenEvents = []; 
     parent.childrenEvents.push(input); 
     inpt.parentEventId = parent.id; 
     rslt = rebuild(parent); 
    } 

    return rslt; 

} 
関連する問題