代码之家  ›  专栏  ›  技术社区  ›  rkralston

具有不可变js的递归分组

  •  3
  • rkralston  · 技术社区  · 6 年前
    var list = new List([
      { "col1": "1", "col2": "A", "col3": "cat", "col4": "dog", "col5": "blue"},
      { "col1": "1", "col2": "A", "col3": "cat", "col4": "dog", "col5": "blue"},
      { "col1": "1", "col2": "A", "col3": "bird", "col4": "dog", "col5": "blue"},
      { "col1": "1", "col2": "B", "col3": "cat", "col4": "dog", "col5": "blue"},
      { "col1": "1", "col2": "B", "col3": "cat", "col4": "dog", "col5": "blue"},
      { "col1": "1", "col2": "B", "col3": "bird", "col4": "dog", "col5": "blue"},
      { "col1": "1", "col2": "C", "col3": "cat", "col4": "dog", "col5": "blue"},
      { "col1": "1", "col2": "C", "col3": "bird", "col4": "dog", "col5": "blue"},
      { "col1": "1", "col2": "C", "col3": "cat", "col4": "dog", "col5": "blue"},
      { "col1": "2", "col2": "A", "col3": "cat", "col4": "dog", "col5": "blue"},
      { "col1": "2", "col2": "A", "col3": "bird", "col4": "dog", "col5": "blue"},
      { "col1": "2", "col2": "A", "col3": "cat", "col4": "dog", "col5": "blue"},
      { "col1": "2", "col2": "B", "col3": "cat", "col4": "dog", "col5": "blue"},
      { "col1": "2", "col2": "B", "col3": "bird", "col4": "dog", "col5": "blue"},
      { "col1": "2", "col2": "B", "col3": "cat", "col4": "dog", "col5": "blue"},
      { "col1": "2", "col2": "C", "col3": "cat", "col4": "dog", "col5": "blue"},
      { "col1": "2", "col2": "C", "col3": "bird", "col4": "dog", "col5": "blue"},
      { "col1": "2", "col2": "C", "col3": "cat", "col4": "dog", "col5": "blue"},
      { "col1": "3", "col2": "A", "col3": "cat", "col4": "dog", "col5": "blue"},
      { "col1": "3", "col2": "A", "col3": "cat", "col4": "dog", "col5": "blue"},
      { "col1": "3", "col2": "A", "col3": "bird", "col4": "dog", "col5": "blue"},
      { "col1": "3", "col2": "B", "col3": "cat", "col4": "dog", "col5": "blue"},
      { "col1": "3", "col2": "B", "col3": "cat", "col4": "dog", "col5": "blue"},
      { "col1": "3", "col2": "B", "col3": "bird", "col4": "dog", "col5": "blue"},
      { "col1": "3", "col2": "C", "col3": "cat", "col4": "dog", "col5": "blue"},
      { "col1": "3", "col2": "C", "col3": "cat", "col4": "dog", "col5": "blue"},
      { "col1": "3", "col2": "C", "col3": "bird", "col4": "dog", "col5": "blue"},
      { "col1": "4", "col2": "A", "col3": "cat", "col4": "dog", "col5": "blue"}
      ]);
    
    let groupedData = list.groupBy(x => x['col1'])
      .map(row => row.groupBy(x => x['col2'])
           .map(row => row.groupBy(x => x['col3']))
       );
    

    我该如何递归地对任何

    2 回复  |  直到 6 年前
        1
  •  1
  •   rkralston    6 年前

    一个递归分组的测试答案不可变.js表示数据表的列表对象:

    recursiveGrouping = (columns, list) => {
        columns.forEach(column => {
            list = this.processIterable(column, list);
        })
        return list;
    }
    
    processIterable = (column, iterable) => {
        if(List.isList(iterable)) return iterable.groupBy(row => row[column]);
        else if(Map.isMap(iterable)) return iterable.map(value => this.processIterable(column, value));
        else return iterable;
    }
    

    基于以上示例,我将使用以下方法进行此调用:

    let grouped data = this.recursiveGrouping(['col1', 'col2', 'col3'], list);
    

    这将返回与手动调用子分组相同的分组。

        2
  •  0
  •   גלעד ברקן    6 年前

    一种方法是只分配第一个 groupBy 呼叫 groupedData ,然后每次分配 groupBy公司 呼叫你所在级别的每个单元格。这将改变初始结构的内部结构 分组数据

    类似(未经测试):

    function dfs(row, i, n){
      if (i > n)
        return;
    
      for (let j=0; j<row.length; j++){
        row[j] = row.groupBy(x => x['col' + i]);
        dfs(row[j], i + 1, n);
      }
    }
    
    let n = ???
    
    let groupedData = list.groupBy(x => x['col1']);
    
    for (row of groupedData)
      dfs(row, 2, n);