刷:所有维度的组合

刷到个比较有意思的场景题,就是平时我们在点菜的时候:热菜、微辣、中份、重麻的全部口味组合,在前端可能是不同下拉的数据源,需要组合成平铺的数据。比如:

javascript 复制代码
const list = [['热', '冷', '冰'], ['大', '中', '小'], ['重辣', '微辣'], ['重麻', '微麻']];

// 要组合成
const r = [
    "热+大+重辣+重麻",
    "热+大+重辣+微麻",
    "热+大+微辣+重麻",
    "热+大+微辣+微麻",
    "热+中+重辣+重麻",
    "热+中+重辣+微麻",
    "热+中+微辣+重麻",
    "热+中+微辣+微麻",
    "热+小+重辣+重麻",
    "热+小+重辣+微麻",
    "热+小+微辣+重麻",
    "热+小+微辣+微麻",
    "冷+大+重辣+重麻",
    "冷+大+重辣+微麻",
    "冷+大+微辣+重麻",
    "冷+大+微辣+微麻",
    "冷+中+重辣+重麻",
    "冷+中+重辣+微麻",
    "冷+中+微辣+重麻",
    "冷+中+微辣+微麻",
    "冷+小+重辣+重麻",
    "冷+小+重辣+微麻",
    "冷+小+微辣+重麻",
    "冷+小+微辣+微麻",
    "冰+大+重辣+重麻",
    "冰+大+重辣+微麻",
    "冰+大+微辣+重麻",
    "冰+大+微辣+微麻",
    "冰+中+重辣+重麻",
    "冰+中+重辣+微麻",
    "冰+中+微辣+重麻",
    "冰+中+微辣+微麻",
    "冰+小+重辣+重麻",
    "冰+小+重辣+微麻",
    "冰+小+微辣+重麻",
    "冰+小+微辣+微麻"
]

这个简单场景可以先简化问题看:

  • 如果只有 2 个类型
javascript 复制代码
const [ ['热', '冷'], ['大', '小'] ];

// 用 2 个 for 循环,来输出所有组合
function fn(arr1, arr2) {
    let r = [];
    
    for (let x of arr1) {
        for (let y of arr2) {
            r.push(`${x} + ${y}`);
        }
    }
    
    return r;
}

这样就会得到:['热 + 大', '热 + 小', '冷 + 大', '冷 + 小'] 这样一个数组,那么我们再添加一个类型:['辣', '微辣', '微微辣'],可以再调用一次 fn(['热 + 大', '热 + 小', '冷 + 大', '冷 + 小'], ['辣', '微辣', '微微辣']) 就可以得到结果啦。

这样就从当初三个数组元素变成了永远 2 个数组组合的模型 fn(fn(x + y), f(z)),就比较经典了,就可以用以下方法来实现:

javascript 复制代码
function compose(list) {
  const len = list.length;

  // 基础的函数模型,2 个数组的全组合
  function fn(arr1, arr2) {
    let r = [];

    for (let x of arr1) {
        for (let y of arr2) {
            r.push(x + '+' + y);
        }
    }

    return r;
  }

  // 我们先从第一个元素和第二个元素的值作为首项
  let dp = fn(list[0], list[1]);

  // 这里一定要从 i = 2 开始,因为 0~1 已经计算过了
  for (let i = 2; i < len; i++) {
    // 每次我们把上次已经计算好的组合数组,当作下一次计算的第一个元素,依次让他遍历完就可以了
    dp = fn(dp, list[i]);
  }

  return dp;
}

const list = [['热', '冷', '冰'], ['大', '中', '小'], ['重辣', '微辣'], ['重麻', '微麻']];
const r = compose(list);

最后 r 就等于上面要的所有组合。

如果是暴力解法的话也是可以的,但是这样相当于有了个抽象函数,更加通用一点。

但是题目本身是解决这个问题,但是这个最好的交互还是应该列出类型,让点菜员自己去点出组合更好的,一般不会有需要列表的情况~除非是后台需要做一个检索。

所以最牛逼的口味还是热+大+重辣+重麻...

相关推荐
WG_173 分钟前
C++多态
开发语言·c++·面试
鱼跃鹰飞23 分钟前
Leetcode面试经典150题-130.被围绕的区域
java·算法·leetcode·面试·职场和发展·深度优先
程序员凡尘26 分钟前
完美解决 Array 方法 (map/filter/reduce) 不按预期工作 的正确解决方法,亲测有效!!!
前端·javascript·vue.js
北岛寒沫5 小时前
JavaScript(JS)学习笔记 1(简单介绍 注释和输入输出语句 变量 数据类型 运算符 流程控制 数组)
javascript·笔记·学习
everyStudy5 小时前
JavaScript如何判断输入的是空格
开发语言·javascript·ecmascript
无心使然云中漫步6 小时前
GIS OGC之WMTS地图服务,通过Capabilities XML描述文档,获取matrixIds,origin,计算resolutions
前端·javascript
Bug缔造者6 小时前
Element-ui el-table 全局表格排序
前端·javascript·vue.js
xnian_7 小时前
解决ruoyi-vue-pro-master框架引入报错,启动报错问题
前端·javascript·vue.js
麒麟而非淇淋8 小时前
AJAX 入门 day1
前端·javascript·ajax
2401_858120538 小时前
深入理解MATLAB中的事件处理机制
前端·javascript·matlab