求笛卡尔积
有这样一个需求:
商品有多个种类的规格,比如:
颜色 大小 是否加厚
红色 S 加厚
蓝色 L 不加厚
黄色 XL
白色 XXL
现在需要生成不同规格组合的多种商品列表供用户选择;
这里就用到笛卡尔积的计算。
function soDkr(arr) { var item = arr.shift(); function dkr(item1, item2) { var res = [ ]; for (var i in item1) { for (var j in item2) { if (item1[i] instanceof Array) { var as = item1[i].slice(0); as.push(item2[j]); res.push(as); } else { res.push([item1[i], item2[j]]); } } } return res; } for (var i in arr) { item = dkr(item, arr[i]); } return item; }
调用如下:
soDkr([['红色','蓝色','黄色','白色'],['S','L','XL','XXL'],['加厚','不加厚']]);
运行结果为:
[["红色", "S", "加厚"], ["红色", "S", "不加厚"], ["红色", "L", "加厚"], ["红色", "L", "不加厚"], ["红色", "XL", "加厚"], ["红色", "XL", "不加厚"], ["红色", "XXL", "加厚"], ["红色", "XXL", "不加厚"], ["蓝色", "S", "加厚"], ["蓝色", "S", "不加厚"], ["蓝色", "L", "加厚"], ["蓝色", "L", "不加厚"], ["蓝色", "XL", "加厚"], ["蓝色", "XL", "不加厚"], ["蓝色", "XXL", "加厚"], ["蓝色", "XXL", "不加厚"], ["黄色", "S", "加厚"], ["黄色", "S", "不加厚"], ["黄色", "L", "加厚"], ["黄色", "L", "不加厚"], ["黄色", "XL", "加厚"], ["黄色", "XL", "不加厚"], ["黄色", "XXL", "加厚"], ["黄色", "XXL", "不加厚"], ["白色", "S", "加厚"], ["白色", "S", "不加厚"], ["白色", "L", "加厚"], ["白色", "L", "不加厚"], ["白色", "XL", "加厚"], ["白色", "XL", "不加厚"], ["白色", "XXL", "加厚"], ["白色", "XXL", "不加厚"]]