排列组合算法

解释:一个衣服有颜色、尺寸、价格等n个维度

导出了arrayCombination函数

// 数据模板-如果你的数据和数据模板不一致,去XXX处修改一下就行
// data = [
//   {
//     尺寸: ["1", "2", "3"],
//   },
//   {
//     价格: ["a", "b", "c"],
//   },
//   {
//     颜色: [",", "?", "!", ">"],
//   },
// ];

// arr的数据格式
// arr = [
//   ["1", "2", "3"],
//   ["a", "b", "c"],
//   [",", "?", "!", ">"],
// ];

// pointerList的数据格式
// pointerList = [
//   {
//     max: 2,
//     now: 0,
//   },
//   {
//     max: 2,
//     now: 0,
//   },
//   {
//     max: 2,
//     now: 0,
//   },
//   {
//     max: 2,
//     now: 0,
//   },
// ];

function arrayCombination(data) {
  let pointerList = [];
  let arr = [];
  // 最终输出
  let StrArr = [];

  // 初始化数据 XXX
  data.forEach((v) => {
    let keyArr = Object.keys(v);
    let item = v[keyArr[0]];
    arr.push(item);
    pointerList.push({
      max: item.length - 1,
      now: 0,
    });
  });

  // 定义指针
  let nowLine = pointerList.length - 2; // 逐层递减指针
  let timersLine = pointerList.length - 1; // 每回合都要从最后一层开始遍历

  while (pointerList[0].now <= pointerList[0].max) {
    StrArr = setStr(StrArr, pointerList, arr);
    // 指针控制
    if (pointerList[timersLine].now === pointerList[timersLine].max) {
      if (timersLine === nowLine + 1) {
        if (pointerList[nowLine].now === pointerList[nowLine].max) {
          if (nowLine === 1) {
            pointerList[0].now++;
            pointerList = reSetIndex(0, pointerList);
            nowLine = pointerList.length - 2;
            timersLine = pointerList.length - 1;
            continue;
          }
          nowLine--;
          if (nowLine < 0) {
            break;
          }
          timersLine = pointerList.length - 1;
          pointerList = reSetIndex(nowLine, pointerList);
          continue;
        }
        pointerList[nowLine].now++;
        timersLine = pointerList.length - 1;
        pointerList = reSetIndex(nowLine, pointerList);
        continue;
      }
      timersLine--;
      pointerList = reSetIndex(timersLine, pointerList);
      continue;
    }

    // 改变now
    pointerList[timersLine].now++;
  }

  return StrArr;
}

// 重置now
function reSetIndex(index, listArr) {
  listArr.forEach((v, i) => {
    if (i > index) {
      v.now = 0;
    }
  });
  return listArr;
}

// 添加组合
function setStr(strArr, pointerList, arr) {
  let str = "";
  pointerList.forEach((v, i) => {
    str += arr[i][v.now];
  });
  strArr.push(str);
  return strArr;
}

export { arrayCombination };

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lar_slw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值