【问题标题】:Immutable.js split key of type MapMap 类型的 Immutable.js 拆分键
【发布时间】:2018-11-29 00:08:20
【问题描述】:

使用 Immutable 的 ListMap 集合考虑以下 example

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' } } ] }");

基本上,我正在寻找的是一种将 origin 中包含的地图按 groupKey 分组的方法,其中每个 id(id1id2id3)指向下图:

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

我无法弄清楚如何拆分从groupBy(在本例中为映射)返回的结果键。我尝试使用 API 提供的mapping functions,但似乎无法根据需要使用它们来更改基数。

实现这一目标的最干净的方法是什么?

【问题讨论】:

    标签: javascript immutable.js


    【解决方案1】:

    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>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-03
      • 2016-06-27
      • 2011-04-02
      • 1970-01-01
      • 2017-11-25
      • 2018-03-08
      相关资源
      最近更新 更多