Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Map类型的Immutable.js拆分键_Javascript_Immutable.js - Fatal编程技术网

Javascript Map类型的Immutable.js拆分键

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:",

使用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:", 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(“分组:”,字符串(分组))