使用笛卡尔积实现商品颜色材质等的组合SKU

实现一个函数`function generateItems(specs)`,接受类似如下的输入数组(例子):
```javascript
[{"id":"17","caption":"颜色","types":["黑","棕"]},
{"id":"23","caption":"材质","types":["牛皮"]},
{"id":"24","caption":"尺码","types":["40","41","42"]}]

数组中的每个对象包含id,caption和types三个属性,其中types是包含复数个字符串的数组
此函数对上述例子输入应当输出如下结果:

[{"17":"黑","23":"牛皮","24":"40"},
{"17":"黑","23":"牛皮","24":"41"},
{"17":"黑","23":"牛皮","24":"42"},

{"17":"棕","23":"牛皮","24":"40"},
{"17":"棕","23":"牛皮","24":"41"},
{"17":"棕","23":"牛皮","24":"42"}]
function generateItems(specs){
  let mapArray = []
  specs.forEach(item=>{
    let a = item.types.map(i=>({[item.id]:i}))
    mapArray.push(a)
  })

  let allResult = [],j=0

    const result = mapArray.reduce((accArr, currentArr) => {
      let result = []
      j++
      currentArr.forEach(c => {
        if (accArr.length) {
          accArr.forEach(a => {
            let obj={}
            a = a.concat(c)
            a.forEach(item=>{
              for(let key in item){
                obj[key] = item[key]
              }
            })
            result.push(a.concat(c))
            if (j > mapArray.length-1) {
              allResult.push(JSON.parse(JSON.stringify(obj)))
            }
          })
        } else {
          result.push([c])
        }
      })
      return result
    }, [])
    
    return allResult
}

 let arr = [{"id":"17","caption":"颜色","types":["黑","棕"]},
  {"id":"23","caption":"材质","types":["牛皮"]},
  {"id":"24","caption":"尺码","types":["40","41","42"]},
  {"id":"25","caption":"填充","types":["气","粉"]},
];
console.log(generateItems(arr))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章