什么事SKU ❓
spu 和 sku 都是属性值的集合
SPU(关键属性), standard product unit, 标准化产品单位,区分品种
SPU是商品信息聚合的最小单位,是一组可复用、易检索的标准化信息的集合,该集合描述了一个产品的特性。通俗点讲,属性值、特性相同的商品就可以称为一个SPU。例如,iphone4就是一个SPU,N97也是一个SPU,这个与商家无关,与颜色、款式、套餐也无关。
SKU(销售属性), stock-keeping unit, 库存量单位, 区分单品
SKU即库存进出计量的单位, 可以是以件、盒、托盘等为单位。在服装、鞋类商品中使用最多最普遍。 例如纺织品中一个SKU通常表示:规格、颜色、款式。
商品特指与商品商家有关的产品, 每个商品有一个商家编码,可对应多个SKU。
例如,每个商品下面有多个颜色,款式,可以有多个SKU。淘宝叫item,京东叫product。
笛卡尔积
算法1实现: dfs
准备指针
3 {
'0': { parent: null, count: 0 },
'1': { parent: '0', count: 0 },
'2': { parent: '1', count: 0 },
'3': { parent: '2', count: 0 }
}
移动指针
0 0 0 0
0 0 0 1
0 0 1 0
算法2实现
/**
* 笛卡尔积组装
* @param {Array} list
* @returns []
*/
function descartes(list) {
// parent 上一级索引;count 指针计数
let point = {}; // 准备移动指针
let ans = []; // 准备返回数据
let pIndex = null; // 准备父级指针
let tempCount = 0; // 每层指针坐标
let temp = []; // 组装当个 sku 结果
// 一:根据参数列生成指针对象
for (let index in list) {
if (typeof list[index] === 'object') {
point[index] = { parent: pIndex, count: 0 };
pIndex = index;
}
}
// 单维度数据结构直接返回
if (pIndex === null) {
return list;
}
// 动态生成笛卡尔积
while (true) {
// 二:生成结果
let index;
for (index in list) {
tempCount = point[index].count;
temp.push(list[index][tempCount]);
}
// 压入结果数组
ans.push(temp);
temp = [];
// 三:检查指针最大值问题,移动指针
while (true) {
if (point[index].count >= list[index].length - 1) {
point[index].count = 0;
pIndex = point[index].parent;
if (pIndex === null) {
return ans;
}
// 赋值 parent 进行再次检查
index = pIndex;
} else {
point[index].count++;
break;
}
}
}
}
测试
console.log(descartes([['男裤', '女裤', '通码'], ['黑', '白']]));
[
[ '男裤', '黑' ],
[ '男裤', '白' ],
[ '女裤', '黑' ],
[ '女裤', '白' ],
[ '通码', '黑' ],
[ '通码', '白' ]
]