2017-03-16 11 views
0

私はソフトウェアフィールドに新しいです。私はオブジェクトのjson配列を持っていますJSON配列データの1つの形式を別の形式に変換しますか?

var treeObj = [ 
     { 
     "name": "sriram", 
     "refernce_id": "SAN001", 
     "sponer_id": "SAN000" 
     }, 
     { 
     "name": "neeraja", 
     "refernce_id": "SAN002", 
     "sponer_id": "SAN001" 
     }, 
     { 
     "name": "upender", 
     "refernce_id": "SAN003", 
     "sponer_id": "SAN001" 
     }, 
     { 
     "name": "manoj", 
     "refernce_id": "SAN004", 
     "sponer_id": "SAN002" 
     }, 
     { 
     "name": "shirisha", 
     "refernce_id": "SAN005", 
     "sponer_id": "SAN002" 
     }, 
     { 
     "name": "ragu", 
     "refernce_id": "SAN006", 
     "sponer_id": "SAN003" 
     }, 
     { 
     "name": "santhu", 
     "refernce_id": "SAN007", 
     "sponer_id": "SAN003" 
     } 
    ]; 

ここで私は上記のオブジェクトを関数に渡します。その関数では、すべてのオブジェクトの参照IDとsponer_idを比較する必要があります。等しい場合は、以下のように子オブジェクトとして呼び出す配列にそれらをプッシュする必要があります。また、子配列で参照ID inが存在する場合、上記のオブジェクトのsponer_idに存在します。これは、それらをreference_idを含むオブジェクトに子配列にプッシュする必要があります。最終的な配列Objectは次のようになります。

[ 
    { 
    "name": "sriram", 
    "parent": null, 
    "children": [ 
     { 
     "name": "neeraja", 
     "parent": "sriram", 
     "children": [ 
      { 
      "name": "manoj", 
      "parent": "neeraja" 
      }, 
      { 
      "name": "shirisha", 
      "parent": "neeraja" 
      } 
     ] 
     }, 
     { 
     "name": "upender", 
     "parent": "sriram", 
     "children": [ 
      { 
      "name": "ragu", 
      "parent": "neeraja" 
      }, 
      { 
      "name": "santhu", 
      "parent": "neeraja" 
      } 
     ] 
     } 
    ] 
    } 
] 

ここで、treeObjのsriramの参照IDは、neerajaおよびupenderオブジェクトのスポンサーIDとして存在します。 neerajaとupenderは子供になってsriramになります。 neerajaのreference_idはtreeObjのmanojおよびshirishaオブジェクトにsponer_idとして存在します。同時に子はもっと多くの子オブジェクトを持つことができ、オブジェクトを動的にフォーマットする必要があります。

私が間違っていたところ私を導いてください

var mainArr = [], subArrs = [], subObj={}, subIds = [], find = "SAN001"; 
    formatData(treeObj); 
    function formatData(treeObj){debugger; 
     var arr = []; 
     for(var x=0; x<= treeObj.length-1; x++){debugger; 
      var sampData = treeObj[x]; 
      if(find == sampData.sponer_id){ 
       arr.push(sampData.refernce_id); 
       subArrs.push(sampData); 
      } 
     } 
     subIds.push(arr); 
     console.log(subIds); 
     console.log(subArrs); 
     formatData(subArrs); 
    } 

のようなルックスを書いた機能。前もって感謝します。

+1

'Java'は' JavaScript'ではありません – Smit

答えて

0
//1. find all items the have no parent and push them on a stack like so: 

let stack = treeObj.reduce((list, item) => { 
    if (<ids match>) list.push(item); 
    return item; 
}, []), 

let result = [].concat(stack); 

//2. while loop the stack: 

while (stack.length > 0) { 
    let item = stack.shift(); 

    item.children = treeObj.reduce((list, child) => { 
    if (<ids match>) { 
     list.push(child); 
    } 
    return list; 
    }, []).map(child => { 
     child.parent = item; 
     stack.unshift(item); 
     return child; 
    }); 
} 

return result; 

»古き良きJS«で、いくつかの改善と

のでUPDATE:基本的に

var stack = treeObj.filter(function (item) { 
    return item.<parent_id> === item.<child_id> }); 

var result = [].concat(stack); 

while (stack.length > 0) { 
    var item = stack.shift(); 

    item.children = treeObj.filter(function (child) { 
    return item.<id> === child.<parent_id>; 
    }); 

    item.children.forEach(function (child) { stack.unshift(child) }); 
} 

  1. ルート(複数可)を見つけ、それらを保存スタック上にある
  2. while.length > 0

    1. shift()スタックから最初の項目は
    2. にparentプロパティを追加

    完了スタック

  • 上のすべてのその項目の子とunshiftそれらを見つけますループ内でアイテムを削除したり不要なアイテムを削除したりすることができます。すべてが再帰を使用して行うこともできますが、私はそのようなことを行うことで»再帰エラーが多すぎましたので、私は反復的な方法を好んでいます。もちろん、.reduceの代わりに.filter.forEachの代わりに、通常のループを使用することができますが、私は機能的なスタイルを好みます。全体として、あなたがそれをどうしていても、それは難しいことではありません。要素を見つけてから、すべての子供たちと繰り返すことができます。 whileループを実行すると、すべての子要素が見つかるか、その要素をルートとするサブツリー全体が検索されます。

    幸運を祈る!

  • +0

    返事をありがとう、philip。しかし、私はエラーが発生している 未知のSyntaxError:letは字句的にバインドされた名前として許可されていません –

    +0

    これはJSの新しいバージョンであるES6です。 – philipp

    +0

    ありがとう、フィリップ... :)あなたのロジックは魅力のように働いていました。 –

    0

    基本的には、配列をn元のツリーに変換しようとしています。

    formatDataに元のツリー関数を入力すると、SAN001を親として持つすべてのオブジェクトの参照IDと、sponerId SAN001を持つすべての子を持つ別の配列(subArrs)を持つ配列(arr)が得られます。

    次に、subIds、log subIds、およびsubArrにarrを格納し、subArrsのフォーマットデータを再帰的に呼び出します。次に、どのオブジェクトに "SAN001 with predecessor"(その時点ですべてのオブジェクトであるべきか)を持つs​​ubArrをチェックし、そのオブジェクトをsubArrにプッシュします。もしそれが間違っていないなら、これは無限ループにつながります。

    改善点: "find"変数は変更されず、 "SAN001"に固定されています - これは、ルートオブジェクトが常にこの参照ID。しかし、2回目の旅行では、どのオブジェクトが2番目のレベル要素に依存しているかチェックしたいので、findを対応するreferenceIdに設定する必要があります。

    サブアルスには、SAN001に応じてすべてのオブジェクトが含まれます。しかし、2回目以降の旅行では、SAN001の子どもをサブアラに入れることは望ましくありません。したがって、SAN001の子を探しているsubArrをトラバースするのではなく、古いオブジェクトでsubArrのオブジェクトの子を見つける必要があります。

    クリアが少し上です。

    さらなる調査のヒント:基本的には、javascriptを使用して「配列をn-aryツリーに変換」しようとしています。

    関連する問題