刷:所有维度的组合

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

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

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

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

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

相关推荐
水木流年追梦2 小时前
agent面试必备31- AI Agent 核心进阶:工具路由(Tool Routing)
数据库·人工智能·oracle·面试·职场和发展·embedding
竹林8182 小时前
用 Pinata + IPFS 存 NFT 元数据踩了三天坑,我总结了这份完整的前端实现方案
javascript
林希_Rachel_傻希希2 小时前
web性能优化之延迟加载图片和<inframe>
前端·javascript·面试
帅次3 小时前
Android 高级工程师面试:Java 多线程与并发 近1年高频追问 22 题
android·java·面试
小米渣的逆袭3 小时前
Chrome Extension Script World(ISOLATED / MAIN)原理与适用场景
前端·javascript·chrome
Esaka_Forever4 小时前
Python 与 JS (V8) 垃圾回收核心区别 + 底层根源分析
开发语言·javascript·jvm
林希_Rachel_傻希希4 小时前
web性能优化之——AI总结视频
前端·javascript·面试
子建莫敌4 小时前
ROS2 面试总结
面试·职场和发展
前端炒粉4 小时前
个人简历面经总结二
前端·网络·vue.js·react.js·面试
binbin_524 小时前
UIAbility 与 WindowStage:窗口创建、加载、销毁的完整链路
开发语言·javascript·深度学习·华为·harmonyos