2017-10-02 1 views
0

をオブジェクトのフラット配列を変換:は私はこのようなオブジェクトのフラット配列を有するグループのプロパティに従ってネストされたアレイに

[ 
    { id: 0 }, 
    { id: 1, group: "a" }, 
    { id: 2, group: "a" }, 
    { id: 3, group: "a/b" }, 
    { id: 4 }, 
    { id: 5, group: "a/b" }, 
] 

目標は、グループのプロパティに基づいて、ネストされた配列にこの配列を変換することです。期待される結果は、次のようになります。

[ 
    { id: 0 }, 
    [ 
     { id: 1, group: "a" }, 
     { id: 2, group: "a" } 
     [ 
     { id: 3, group: "a/b" }, 
     { id: 5, group: "a/b" } 
     ],  
    ], 
    { id: 4 }, 
] 

簡単な方法はありますか?

+1

? –

+0

これはあなたが使用している奇妙な出力形式です。 – baao

+1

実際に 'group'コンテンツを解析し、項目が順序付けられていないので、入れ子にする前に要素を順番に並び替える必要があります。 –

答えて

2

ネストされたアイテムのレベルに対して、ネストされたハッシュテーブルを使用する動的アプローチを使用できます。これは親が使用することを意味するもの

var data = [{ id: 0 }, { id: 1, group: "a" }, { id: 2, group: "a" }, { id: 3, group: "a/b" }, { id: 4 }, { id: 5, group: "a/b" }], 
 
    result = [], 
 
    hash = { _: result }; 
 

 
data.forEach(function (o) { 
 
    if (!o.group) { 
 
     hash._.push(o); 
 
     return; 
 
    } 
 
    o.group.split('/').reduce(function (r, k) { 
 
     if (!r[k]) { 
 
      r[k] = { _: [] }; 
 
      r._.push(r[k]._); 
 
     } 
 
     return r[k]; 
 
    }, hash)._.push(o); 
 
}); 
 

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

1

IMHO少し畳み込まれています。キーがgroupの内容であるdictを作成して使用する方が簡単です。

あなたが特に効率的である必要はありません場合は、私がしたい:

  1. をキーはgroupの内容であることで辞書を作成します。
  2. ためのキー(例えばアルファベット順)キーごとに
    1. が前のキーを確認し、それが拡張だかどうかを確認し(例えば、「/ b」は前のキー 'に比べ「/ B」を持っていますa '
    2. 拡張子がある場合は、スタック上のキーを押して、配列内に入れ子レベルを作成します。
    3. 他の場合は、キーが前のキーを拡張していない場合は、スタック
    4. 拡張子にfで作成したdictのすべての要素を追加する最初のステップ

これはそれを行う必要があります。

+0

ありがとう、効率はここで問題ではありません。実際の配列は実際には小さいです。 – subarachnid

関連する問題