# 笛卡尔积
常见应用 SKU 选择器
点击查看代码
/**
* 笛卡尔积
* @param {any[]} skuAttrs
* @returns any[]
*/
const descartes = (skuAttrs = []) => {
if (skuAttrs.length < 2) {
return skuAttrs[0] || []
}
return skuAttrs.reduce((total, current) => {
const res = []
total.forEach(t => {
current.forEach(c => {
const temp = Array.isArray(t) ? [...t] : [t]
temp.push(c)
res.push(temp)
})
})
return res
})
}
// ---------- Test ---------
const colors = ["黑色", "白色"],
length = ["长款", "短款"],
material = ["棉质", "涤纶"],
sizes = ["S", "M", "L"];
console.log(descartes([colors, length, material, sizes]))
// [
// ["黑色","长款","棉质","S"],
// ["黑色","长款","棉质","M"],
// ["黑色","长款","棉质","L"],
// ["黑色","长款","涤纶","S"],
// ["黑色","长款","涤纶","M"],
// ["黑色","长款","涤纶","L"],
// ["黑色","短款","棉质","S"],
// ["黑色","短款","棉质","M"],
// ["黑色","短款","棉质","L"],
// ["黑色","短款","涤纶","S"],
// ["黑色","短款","涤纶","M"],
// ["黑色","短款","涤纶","L"],
// ["白色","长款","棉质","S"],
// ["白色","长款","棉质","M"],
// ["白色","长款","棉质","L"],
// ["白色","长款","涤纶","S"],
// ["白色","长款","涤纶","M"],
// ["白色","长款","涤纶","L"],
// ["白色","短款","棉质","S"],
// ["白色","短款","棉质","M"],
// ["白色","短款","棉质","L"],
// ["白色","短款","涤纶","S"],
// ["白色","短款","涤纶","M"],
// ["白色","短款","涤纶","L"]
// ]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57