【场景】笛卡尔积

电商系统中商品多规格选项(颜色、容量、版本等)的组合问题,核心算法是「笛卡尔积(Cartesian Product)」;如果涉及「过滤无效组合(比如某颜色无某容量)」「关联SKU/价格/库存」,则是在笛卡尔积基础上叠加「组合过滤/映射」逻辑,属于笛卡尔积的业务扩展。

一、先通俗理解:笛卡尔积就是「所有可能的组合」

笛卡尔积的本质是:多个集合中,取出每个集合的一个元素,组成所有可能的有序组合

对应电商场景:

  • 每个规格维度(颜色、容量)是一个「集合」;
  • 每个集合里的选项(比如颜色集合:红、蓝;容量集合:128G、256G)是集合的元素;
  • 笛卡尔积就是把这些维度的元素两两/多多搭配,生成所有可能的规格组合。
举例:2个维度的笛卡尔积
维度1(颜色) 维度2(容量)
红色 128G
蓝色 256G

笛卡尔积结果(所有组合):
[红色+128G, 红色+256G, 蓝色+128G, 蓝色+256G]

举例:3个维度的笛卡尔积(颜色+容量+版本)
颜色 容量 版本
128G 标准版
256G 顶配版

笛卡尔积结果(共2×2×2=8种):
[红+128G+标准版, 红+128G+顶配版, 红+256G+标准版, 红+256G+顶配版, 蓝+128G+标准版, 蓝+128G+顶配版, 蓝+256G+标准版, 蓝+256G+顶配版]

二、笛卡尔积的核心实现(代码示例)

下面用JavaScript实现通用的多维度规格组合生成,适配任意数量的维度(颜色、容量、版本等):

js 复制代码
/**
 * 生成多维度规格的笛卡尔积
 * @param {Object} specs - 规格维度集合,比如 { color: ['红','蓝'], capacity: ['128G','256G'] }
 * @returns {Array} 所有规格组合(对象形式)
 */
function cartesianProduct(specs) {
  // 1. 提取所有维度的key和对应的选项数组
  const dims = Object.keys(specs); // ['color', 'capacity']
  const values = dims.map(key => specs[key]); // [['红','蓝'], ['128G','256G']]
  
  // 2. 初始化结果:初始为[{}](空组合)
  let result = [{}];
  
  // 3. 遍历每个维度,叠加组合
  for (let i = 0; i < values.length; i++) {
    const temp = [];
    const dimKey = dims[i]; // 当前维度(比如color)
    const dimValues = values[i]; // 当前维度的选项(比如['红','蓝'])
    
    // 遍历已有结果,和当前维度的每个选项组合
    for (const prev of result) {
      for (const val of dimValues) {
        temp.push({ ...prev, [dimKey]: val });
      }
    }
    result = temp;
  }
  
  return result;
}

// 测试:2个维度
const specs = {
  color: ['红色', '蓝色'],
  capacity: ['128G', '256G']
};
console.log(cartesianProduct(specs));
// 输出:
// [
//   { color: '红色', capacity: '128G' },
//   { color: '红色', capacity: '256G' },
//   { color: '蓝色', capacity: '128G' },
//   { color: '蓝色', capacity: '256G' }
// ]

// 测试:3个维度
const specs3 = {
  color: ['红','蓝'],
  capacity: ['128G','256G'],
  version: ['标准版','顶配版']
};
console.log(cartesianProduct(specs3)); // 输出8种组合

三、电商实际场景的扩展(笛卡尔积+业务逻辑)

纯笛卡尔积会生成「所有理论组合」,但电商中很多组合是无效的(比如"红色+512G"无库存、"蓝色+128G"已下架),因此需要在笛卡尔积基础上做扩展:

1. 过滤无效组合

生成笛卡尔积后,结合后台SKU数据过滤掉「无库存/已下架/不支持」的组合:

js 复制代码
// 假设后台返回的有效SKU列表(每个SKU对应一个有效组合+价格/库存)
const validSKUs = [
  { color: '红色', capacity: '128G', price: 2999, stock: 100 },
  { color: '红色', capacity: '256G', price: 3499, stock: 50 },
  { color: '蓝色', capacity: '256G', price: 3499, stock: 80 }
];

// 生成所有笛卡尔积组合后,过滤出有效组合
const allCombos = cartesianProduct(specs);
const validCombos = allCombos.filter(combo => {
  // 匹配有效SKU(按维度字段匹配)
  return validSKUs.some(sku => {
    return sku.color === combo.color && sku.capacity === combo.capacity;
  });
});
console.log(validCombos);
// 输出:排除了「蓝色+128G」,只保留3个有效组合
2. 关联SKU属性(价格、库存、SKU ID)

每个有效组合对应一个唯一SKU,用户选择组合后,需映射到对应的SKU信息:

js 复制代码
// 用户选择的组合
const userSelected = { color: '红色', capacity: '128G' };

// 找到对应的SKU
const matchedSKU = validSKUs.find(sku => {
  return sku.color === userSelected.color && sku.capacity === userSelected.capacity;
});
console.log(matchedSKU);
// 输出:{ color: '红色', capacity: '128G', price: 2999, stock: 100 }
3. 优化:避免组合数爆炸(维度多的场景)

如果维度多(比如颜色5种+容量4种+版本3种+套餐2种),笛卡尔积会生成 5×4×3×2=120 种组合,前端渲染/处理会卡顿,优化方案:

  • 懒生成:先只渲染单个维度的选项,用户选完一个维度后,再生成下一个维度的「可选选项」(比如用户选"红色",再查红色支持的容量,而非一次性生成所有);
  • 后端预计算:把所有有效组合提前存在数据库,前端只请求「当前已选维度下的可选选项」(比如选了红色,后端返回红色支持的容量:128G、256G)。

四、总结

  1. 核心算法:商品多规格组合的基础是「笛卡尔积」,负责生成所有理论上的维度组合;
  2. 业务扩展:实际电商中需叠加「组合过滤」(剔除无效组合)、「SKU映射」(关联价格/库存);
  3. 性能优化:维度多的时候,通过「懒生成」「后端预计算」避免组合数爆炸。

这个逻辑是电商SKU管理的核心,几乎所有电商平台(淘宝、京东、拼多多)的商品规格选择,底层都是笛卡尔积+业务过滤的思路。

相关推荐
前端市界2 分钟前
用 React 手搓一个 3D 翻页书籍组件,呼吸海浪式翻页,交互体验带感!
前端·架构·github
文艺理科生4 分钟前
Nginx 路径映射深度解析:从本地开发到生产交付的底层哲学
前端·后端·架构
千寻girling4 分钟前
主管:”人家 Node 框架都用 Nest.js 了 , 你怎么还在用 Express ?“
前端·后端·面试
少控科技5 分钟前
QT第6个程序 - 网页内容摘取
开发语言·qt
darkb1rd5 分钟前
八、PHP SAPI与运行环境差异
开发语言·网络安全·php·webshell
历程里程碑8 分钟前
Linux20 : IO
linux·c语言·开发语言·数据结构·c++·算法
郝学胜-神的一滴10 分钟前
深入浅出:使用Linux系统函数构建高性能TCP服务器
linux·服务器·开发语言·网络·c++·tcp/ip·程序人生
承渊政道13 分钟前
Linux系统学习【Linux系统的进度条实现、版本控制器git和调试器gdb介绍】
linux·开发语言·笔记·git·学习·gitee
C澒13 分钟前
Vue 项目渐进式迁移 React:组件库接入与跨框架协同技术方案
前端·vue.js·react.js·架构·系统架构
xiaoxue..27 分钟前
合并两个升序链表 与 合并k个升序链表
java·javascript·数据结构·链表·面试