2016-12-11 16 views
0

私は、それぞれに2つのカテゴリを含むオブジェクトの配列を持っています。これらのカテゴリの1つはグループを表します。フィールドによるオブジェクトの配列のフィルタリング

[ 
    { 
    "uuid": 123, 
    "group": "test_group" 
    }, 
    { 
    "uuid": 321, 
    "group": "test_group" 
    }, 
    { 
    "uuid": 432, 
    "group": "test_group2" 
    } 
] 

グループ別に分類したJSONレスポンスを生成したいと考えています。私は最初の反復処理と関係するグループの全てのセットを作成し、再度反復し、それらを適切にグループ化することによって、これを達成してきた瞬間に

{ 
    "objects": [ 
    { 
     "group": "test_group", 
     "items": [ 
     { 
      "uuid": 123 
     }, 
     { 
      "uuid": 321 
     } 
     ] 
    }, 
    { 
     "group": "test_group2", 
     "items": [ 
     { 
      "uuid": 432 
     } 
     ] 
    } 
    ] 
} 

。おそらくES6で導入された新しい演算子のいくつかを使用して、これを行うためのより簡潔な方法があるのだろうかと思っていました。

+4

このようなデータ再構成では、ES6に固有のことは何もありません。あなたは、ES5ソリューションを取って、矢印関数、スプレッド演算子、分解、そしてたぶん 'Array#find'メソッドを使って、より簡潔で読みやすいものにすることができます。 –

+0

この質問は多岐にわたっています。この作業はさまざまな方法で実行できます。あなた自身で解決策を見つけようとしてください。何か問題が発生した場合は、尋ねてください。 –

+0

私は解決策を持っていると言いましたが、ここで誰かが別のものを取るかどうかを尋ねていました... – FredLoh

答えて

3

Array#reduceを使用して反復し、グループによって項目をMapに収集します。これは簡単にES6で導入するためにいくつかの新しいオペレータまたは配列関数があるの私は、しかし、あなたは可能性が、知らない

const data = [ 
 
    { 
 
    "uuid": 123, 
 
    "group": "test_group" 
 
    }, 
 
    { 
 
    "uuid": 321, 
 
    "group": "test_group" 
 
    }, 
 
    { 
 
    "uuid": 432, 
 
    "group": "test_group2" 
 
    } 
 
]; 
 

 
const result = [...data.reduce((hash, { uuid, group }) => { 
 
    const current = hash.get(group) || { group, items: [] }; 
 
    
 
    current.items.push({ uuid }); 
 
    
 
    return hash.set(group, current); 
 
}, new Map).values()]; 
 

 
console.log(result);

+0

'new map'のかっこは意図的に省略しましたか?また、この方法ではより明示的なので、反復可能なオブジェクトを配列に変換するためには、普及構文の代わりに 'Array.from()'を使う方が良いと思います。 –

+0

もちろん。彼らは[オプション](http://stackoverflow.com/a/3034952/5157454)です。私は 'Array.from()'が好きですが、広がっていれば配列を見ることができるので、何がもっと明白であるか分かりません。 –

+0

@OriDrori最後に新しいマップが作成される理由は何ですか?私はその時点までそれに追いついていて、迷ってしまいます。なぜそれが必要ですか? – FredLoh

0

:バック配列にMap#valuesを変換するためにスプレッドを使用し

関連する問題