刷:所有维度的组合

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

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 就等于上面要的所有组合。

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

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

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

相关推荐
郝学胜-神的一滴3 小时前
Three.js光照技术详解:为3D场景注入灵魂
开发语言·前端·javascript·3d·web3·webgl
m0dw4 小时前
vue懒加载
前端·javascript·vue.js·typescript
cecyci6 小时前
如何实现AI聊天机器人的打字机效果?
前端·javascript
怪兽20147 小时前
请例举 Android 中常用布局类型,并简述其用法以及排版效率
android·面试
余道各努力,千里自同风7 小时前
el-input 输入框宽度自适应宽度
javascript·vue.js·elementui
Southern Wind8 小时前
Vue 3 多实例 + 缓存复用:理念及实践
前端·javascript·vue.js·缓存·html
南一Nanyi8 小时前
才知道 DNS 还能基于 HTTPS 实现!
网络协议·安全·面试
xxxxxxllllllshi8 小时前
Java中Elasticsearch完全指南:从零基础到实战应用
java·开发语言·elasticsearch·面试·职场和发展·jenkins
前端拿破轮8 小时前
从0到1搭一个monorepo项目(一)
前端·javascript·git
Mintopia9 小时前
🎨 AIGC 内容过滤技术:当创作的洪流遇上理性的堤坝
前端·javascript·aigc