使用笛卡爾積實現商品顏色材質等的組合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))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章