簡體   English   中英

Map類型的Immutable.js拆分鍵

[英]Immutable.js split key of type Map

考慮以下使用不可變的ListMap集合的示例

const Map = Immutable.Map;
const List = Immutable.List;

const origin = List([Map({name: 'element1', groupKey: Map({id1: 'foo', id2: 'bar'})}), Map({name: 'element2', groupKey: Map({id3: 'foo'})})]);

console.log("Origin:", String(origin));

const grouped = origin.groupBy( el => el.get('groupKey'));

console.log("Grouped:", String(grouped));

console.log("Expected", "OrderedMap { 'id1': List [ Map { 'name': 'element1', 'groupKey': Map { 'id1': 'foo', 'id2': 'bar' } } ], 'id2': List [ Map { 'name': 'element1', 'groupKey': Map { 'id1': 'foo', 'id2': 'bar' } } ], 'id3': List [ Map { 'name': 'element2', 'groupKey': Map { 'id3': 'foo' } } ] }");

基本上,我正在尋找的是一種通過groupKeyorigin對包含的地圖進行groupKey的方法,其中每個ids( id1id2id3 )都指向要映射的地圖:

{
 id1: [{'name': 'element1', ...}],
 id2: [{'name': 'element1', ...}],
 id3: [{'name': 'element2', ...}],
} 

我不知道如何分割從groupBy返回的結果鍵(在本例中為Maps)。 我嘗試使用API​​提供的映射函數 ,但似乎無法根據需要使用它們來更改基數。

實現這一目標的最干凈的方法是什么?

el.get('groupKey')值是唯一的映射。 因此,每個元素都在其自己的組中。

groupBy函數無法按多個鍵進行分組,每個元素都將歸為一個組。

const origin = List([
  Map({name: 'element1', groupKey: 'banana'}), 
  Map({name: 'element2', groupKey: 'rocket'}),
  Map({name: 'element3', groupKey: 'rocket'}),
  Map({name: 'element4', groupKey: 'rocket'}),
]);

const groupedMap = origin.groupBy( el => el.get('groupKey'));
// results in:
// "OrderedMap { 'banana': List [ Map { 'name': 'element1', 'groupKey': 'banana' } ], 'rocket': List [ Map { 'name': 'element2', 'groupKey': 'rocket' }, Map { 'name': 'element3', 'groupKey': 'rocket' }, Map { 'name': 'element4', 'groupKey': 'rocket' } ] }"

如果要按示例對多個值進行分組,則需要編寫自己的分組函數。 列表可能對分組鍵更有意義,但讓我們繼續以下示例:

 const Map = Immutable.Map; const List = Immutable.List; const OrderedMap = Immutable.OrderedMap; const origin = List([ Map({name: 'element1', groupKey: Map({id1: 'foo', id2: 'bar'})}), Map({name: 'element2', groupKey: Map({id3: 'foo'})}), Map({name: 'element3', groupKey: Map({id99: 'bar'})}), Map({name: 'element4'}), ]); function groupByMap(map, mapKey) { const groups = {}; let keyMap; map.forEach(elem => { keyMap = elem.get(mapKey); if (Immutable.isCollection(keyMap)) { keyMap.valueSeq().forEach(k => { if (!groups[k]) { groups[k] = [elem]; } else { groups[k].push(elem); } }); } else if(groups['lost+found']){ groups['lost+found'].push(elem); } else { groups['lost+found'] = elem; } }); return Immutable.fromJS(groups); } const grouped = groupByMap(origin, 'groupKey'); console.log("Grouped:", String(grouped)); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/4.0.0-rc.9/immutable.js"></script> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM