Javascript Map类型的Immutable.js拆分键
使用Immutable的Javascript Map类型的Immutable.js拆分键,javascript,immutable.js,Javascript,Immutable.js,使用Immutable的列表和映射集合考虑以下内容: 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:",
列表
和映射
集合考虑以下内容:
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' } } ] }");
基本上,我搜索的是一种方法,通过groupKey
将包含的地图从origin
分组,每个ID(id1
,id2
,id3
)指向下面的地图:
{
id1: [{'name': 'element1', ...}],
id2: [{'name': 'element1', ...}],
id3: [{'name': 'element2', ...}],
}
我不知道如何分割从groupBy
返回的结果键(在本例中是映射)。我尝试使用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;
常量列表=不可变的.List;
const OrderedMap=Immutable.OrderedMap;
常量原点=列表([
Map({name:'element1',groupKey:Map({id1:'foo',id2:'bar'})}),
映射({name:'element2',groupKey:Map({id3:'foo'})}),
映射({name:'element3',groupKey:Map({id99:'bar'})}),
映射({name:'element4'}),
]);
函数groupByMap(映射,映射键){
常量组={};
让键映射;
map.forEach(elem=>{
keyMap=elem.get(mapKey);
if(不可变的.isCollection(keyMap)){
keyMap.valueSeq()forEach(k=>{
如果(!组[k]){
组[k]=[elem];
}否则{
组[k]。推(elem);
}
});
}else if(组['lost+found']){
组['lost+found'].push(elem);
}否则{
组['lost+found']=elem;
}
});
返回Immutable.fromJS(组);
}
constgrouped=groupByMap(原点为“groupKey”);
log(“分组:”,字符串(分组))代码>