欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

js 二维数组排列组合--回溯算法

程序员文章站 2022-05-21 23:18:37
...

前言

前2天接到了个图表统计的功能,而这个图表展示有个需求,需要根据所选的维度,计算出维度组合数量并展示出来。实际需求场景如下:
比如有下面数据:

const dim1 = [{ id: 1, name: '维度1' }, { id: 2, name: '维度2' }];
const dim2 = [{ id: 3, name: '维度3' }, { id: 4, name: '维度4' }];
//...dim[n] = [xxxxxxx]

我们要做的功能,就是要计算dim1、dim2、dim[n]之间有多少种组合,比如:
两个维度下:

维度1
维度3
维度4
维度2
维度3
维度4

三个维度下:

const dim1 = [{ id: 1, name: '维度1' }, { id: 2, name: '维度2' }];
const dim2 = [{ id: 3, name: '维度3' }];
const dim3 = [{ id: 5, name: '维度5' }, { id: 6, name: '维度6' }];
//...dim[n] = [xxxxxxx]
维度1
维度3
维度5
维度6
维度2
维度3
维度5
维度6

废话不多说,直接先上代码

const getDimComb = (doubleList = []) => {

  if (doubleList.length == 0) return [];//先return掉空的
  
  const result = [];//最终组合集
  /**
  * doubleList 二维数组 Array
  * index 当前所在步骤
  * currentList 当前累积维度的数组
  */
  const _back = (doubleList, index, currentList) => {
  	//判断是否到了最底层
    if (index >= doubleList.length) {
      result.push([...currentList]);
    } else {
      //循环递归
      doubleList[index].forEach(item => {
      	//累加当前数组
        currentList.push(item);
        //递归
        _back(doubleList, index + 1, currentList)
        currentList.pop();
      });
    }
  }
  _back(doubleList, 0, []);
  return result;
}

const result = getDimComb([
  [{ id: 1, name: '维度1' }, { id: 2, name: '维度2' }],
  [{ id: 4, name: '维度4' }, { id: 5, name: '维度5' }]
]);

console.log('不同维度组合之间共有 '+result.length+' 种组合方式');
console.log(result)

// 不同维度组合之间共有4种组合方式
// [
//   [{ id: 1, name: '维度1' }, { id: 4, name: '维度4' }],
//   [{ id: 1, name: '维度1' }, { id: 5, name: '维度5' }],
//   [{ id: 2, name: '维度2' }, { id: 4, name: '维度4' }],
//   [{ id: 2, name: '维度2' }, { id: 5, name: '维度2' }]
// ]

解析:
作者暂时还没空写,后续补充