2017-01-21 14 views
1

まず、この混乱するタイトルには申し訳ありませんが、本当にタイトルとしては良いものは見つかりません。2つのキーと条件で配列を並べ替える方法

だから、私は私の配列

id   parent 
556   2 
563   2 
568   2 
511   510 
555   510 
. 
. 
. 
510   568 

PrestaShopの

にいくつかのカテゴリをインポートしようとしている私は、この順序でインポートしようとしています。 Prestashopは、カテゴリID511の親カテゴリ(510)がまだ存在しないためエラーとなります。

この配列をソートする方法がわからないので、これは起こりません。

+0

あなたは、このデータがどのように保存されているのですか? –

+0

私はそれをXMLから取り出し、JavaScriptのオブジェクトの配列として解析しました – John

+0

データに循環関係がある場合、1回のパスでインポートできるリストをソートする方法はありません。おそらくリストの上に2つのパスが必要です。 – 4castle

答えて

1

ツリーを使用して、最上位レベルのアイテムを最初に作成することができます。

ツリーは、ソートされていないアイテムと1つのループで構築され、アイテムを収集するための一時的なオブジェクトoです。次に、pに収集されたすべての親ノードがチェックされ、データが利用できない場合、ルートノードが見つけられ、結果としてrに追加され、後でツリーとして返されます。

最後のソート順は、ツリーが反復され、利用可能なdataがソートされた配列にプッシュされます。 childrenプロパティが見つかった場合は配列、配列が正しい場合は、親が最初にプッシュされたことを意味する正しい順序で項目を取得するために子は反復呼び出しiterで反復されます。

var data = [{ id: 556, parent: 2 }, { id: 563, parent: 2 }, { id: 568, parent: 2 }, { id: 511, parent: 510 }, { id: 555, parent: 510 }, { id: 510, parent: 568 }], 
 
    sorted = [], 
 
    tree = function (data) { 
 
     var o = {}, p = {}, r = []; 
 
     data.forEach(function (a) { 
 
      var temp = { data: a }; 
 
      p[a.parent] = true; 
 
      temp.children = o[a.id] && o[a.id].children; 
 
      o[a.id] = temp; 
 
      o[a.parent] = o[a.parent] || {}; 
 
      o[a.parent].children = o[a.parent].children || []; 
 
      o[a.parent].children.push(temp); 
 
     }); 
 
     Object.keys(p).forEach(function (k) { 
 
      if (!o[k].data) { 
 
       r.push(o[k]); 
 
      } 
 
     }); 
 
     return r; 
 
    }(data); 
 

 
tree.forEach(function iter(n) { 
 
    if (n.data) { 
 
     sorted.push(n.data); 
 
    } 
 
    if (Array.isArray(n.children)) { 
 
     n.children.forEach(iter); 
 
    } 
 
}); 
 

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

関連する問題