2016-10-04 11 views
4

特定のオブジェクトキーでグループ化された不変のマップを出力するオブジェクトの配列をマップしたい。マップオブジェクトのマップをオブジェクトキーjsでグループ化マップ不変

array looks like 
[ 
{id:1, time:19072016}, 
{id:2, time:19072016}, 
{id:3, time:19072015}, 
] 
output im seeking is 
[ 
byId: { 
    1:{id:1, time:19072016}, 
    2:{id:2, time:19072016}, 
    3:{id:3, time:19072015}, 
}, 
byTime: { 
    19072016:[1,2], 
    19072015:[3], 
} 
] 

immutablejsまたはシームレス不変型を使用して行う最も効果的な方法は何ですか?

は、現在のように削減使用してイム:私はそれをしたいと

array.reduce((final,row) =>final.setIn(['byId',row.id],row) , 
       Immutable.Map({byId:{},byTime:{}}); 

この出力byIdsを、しかしbyTimeの問題は、私は上書きしないマージする必要があるということです。

私がやったシームレス-不変で試してみました:

Seamless(arr).toObject(i=>[i.id,i]) //this will return byId as i want it 
Seamless(arr).toObject(i=>[i.time,[i.id]]) //this will not merge [1,2] :(

答えて

0

あなたがアイテムをグループ化するために、プレーンJavascriptを使用することができます。

var data = [{ id: 1, time: 19072016 }, { id: 2, time: 19072016 }, { id: 3, time: 19072015 }, ], 
 
    result = data.reduce(function (r, a) { 
 
     r.byId[a.id] = a; 
 
     r.byTime[a.time] = r.byTime[a.time] || []; 
 
     r.byTime[a.time].push(a.id); 
 
     return r; 
 
    }, { byId: {}, byTime: {} }); 
 

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

+0

r.byTime [a.time] ''三回呼び出すと、過剰なようです。 –

+0

あなたは一時変数を投げることができます。 –

1

あなたは.groupBy().map()を使用することによって、あなたが欲しいものを得ることができます。

const data = Immutable.fromJS([ 
 
    {id:1, time:19072016}, 
 
    {id:2, time:19072016}, 
 
    {id:3, time:19072015}, 
 
]); 
 

 
const byId = data 
 
    .groupBy(item => item.get('id')) 
 
    .map(items => items.first()); 
 
console.log(byId); 
 

 
const byTime = data 
 
    .groupBy(item => item.get('time')) 
 
    .map(items => items.map(item => item.get('id'))); 
 
console.log(byTime);
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.2/immutable.js"></script>

関連する問題