Javascript 具有不可变js的递归分组

Javascript 具有不可变js的递归分组,javascript,recursion,grouping,immutable.js,Javascript,Recursion,Grouping,Immutable.js,这将按col1、col2和col3创建三个级别的分组 对于任意n个要分组的列以及任意顺序的列([coln,col4,coln-1]),我将如何递归地执行此操作?一种方法可能是仅将第一个groupBy调用分配给groupedData,然后在其上运行DFS,每次将groupBy调用分配给您所在级别的每个单元格。这将改变初始groupedData的内部结构,但我认为您的代码已经这样做了 类似于(未经测试): 函数dfs(行,i,n){ 如果(i>n) 返回; 对于(设j=0;j x['col'+i])

这将按col1、col2和col3创建三个级别的分组


对于任意n个要分组的列以及任意顺序的列([coln,col4,coln-1]),我将如何递归地执行此操作?

一种方法可能是仅将第一个
groupBy
调用分配给
groupedData
,然后在其上运行DFS,每次将
groupBy
调用分配给您所在级别的每个单元格。这将改变初始
groupedData
的内部结构,但我认为您的代码已经这样做了

类似于(未经测试):

函数dfs(行,i,n){
如果(i>n)
返回;
对于(设j=0;j x['col'+i]);
dfs(第[j]行,i+1,n);
}
}
设n=???
让groupedData=list.groupBy(x=>x['col1']);
对于(组数据行)
dfs(世界其他地区,2,n);

表示数据表的immutable.js List对象上递归分组的测试答案:

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']))
   );
基于以上示例,我将使用以下方法进行此调用:

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;
}

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

Gilead,我的代码会这样做。我只是不知道如何使这些调用都是递归的,以便添加例如“colN”。我也同意第一个应该单独运行,然后是其他相同的。我只是不知道该怎么做。@rkralston我添加了一个未经测试的示例。这对于不同的列名以及不按顺序排列的列或使用不以0开头的列进行分组的列不起作用。谢谢你推动我的思考,这很有帮助。@rkralston不客气!但是如果是那样的话,我不知道你想要什么。请在问题陈述中澄清,并提供我们可以使用的示例。
let grouped data = this.recursiveGrouping(['col1', 'col2', 'col3'], list);