2016-06-21 6 views
-3

私は、プロパティと同じキーを含むオブジェクトの複数の配列のキーとしてラベルプロパティを含むオブジェクトに、次のオブジェクトの配列を変換しようとしています。アレイをオブジェクトに変換する?

ここに配列をマップする関数のJSBinがありますが、私が望む出力を得るために使用するES6ロジックについてはわかりません。 ES6で

https://jsbin.com/foyijisaku/1/edit?js,console

元の配列

var originalArray = 

    [ 
     { 
     'id': 6, 
     'label': 'hello' 
     }, 
     { 
     'id': 5, 
     'label': 'hello' 
     }, 
     { 
     'id': 4, 
     'label': 'bye' 
     }, 
     { 
     'id': 3, 
     'label': 'bye' 
     }, 
     { 
     'id': 2, 
     'label': 'bye' 
     }, 
     { 
     'id': 1, 
     'label': 'bye' 
     } 
    ] 

新しいオブジェクト

var newObject = 

    { 
     'hello': [ 
      { 
       'id': 6, 
       'label': 'hello' 
      }, 
      { 
       'id': 5, 
       'label': 'hello' 
      }, 
     ], 
     'bye': [ 
      { 
       'id': 4, 
       'label': 'bye' 
      }, 
      { 
       'id': 3, 
       'label': 'bye' 
      }, 
      { 
       'id': 2, 
       'label': 'bye' 
      }, 
      { 
       'id': 1, 
       'label': 'bye' 
      }, 
     ] 
    } 
+0

ES6/ES2015とは関係ありません。何を試しましたか? –

+0

あなた自身のレデューサーを手動で書く必要があります。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce – jaybee

+0

リデューサーは私が感謝のために探していたものです。 – eveo

答えて

2
var originalArray = 

    [ 
     { 
     'id': 6, 
     'label': 'hello' 
     }, 
     { 
     'id': 5, 
     'label': 'hello' 
     }, 
     { 
     'id': 4, 
     'label': 'bye' 
     }, 
     { 
     'id': 3, 
     'label': 'bye' 
     }, 
     { 
     'id': 2, 
     'label': 'bye' 
     }, 
     { 
     'id': 1, 
     'label': 'bye' 
     } 
    ] 

var newObject = originalArray.reduce(function(accumulator, current) { 
    accumulator[current.label] = accumulator[current.label] || []; 
    accumulator[current.label].push({ 
    id: current.id, 
    label: current.label 
    }); 
    return accumulator; 
}, {}) 

、拡散演算子で:

var newObject = originalArray.reduce((accumulator, current) => { 
    accumulator[current.label] = accumulator[current.label] || []; 
    accumulator[current.label].push({...current}); 
    return accumulator; 
}, {}) 

現在を直接プッシュしない理由は、参照を避けるためです。

+0

ありがとう、このコードを実行する時間を費やすつもりです。 – eveo

0

アレイ全体を反復処理する必要があります。 for...inループでこれを行うことができます。

var newObject; 
for(var o in originalArray){ 
    if(o.label == 'hello'){ 
     var len = object['hello'].length; 
     object['hello'][len] = o; 
    }else{ 
     var len = object['bye'].length; 
     object['bye'][len] = o; 
    } 
} 
+0

[配列のために 'for ... in'を使わないでください](http://stackoverflow.com/questions/9329446/for-each-over-an-array-in-javascript)通常の' for'ループまたは['forEach'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach) –

関連する問題