前兩天做電商前端的朋友問我,根據產品屬性,顯示出所有不同屬性產品,屬性是動態的。
這是電商中經常會遇到的笛卡爾積問題。
例如一個手機有金色,白色。內存有8G,16G。
那他就要生成4中不同屬性的手機。
我的做法如下:
// 產品屬性
let list = [
{
name: '存儲容量',
checkList: [
{
name: '8g',
id: 111325
},
{
name: '16g',
id: 111327
}],
},
{
name: '產品類型',
checkList: [
{
name: 'iphone',
id: 111303
},
{
name: 'vivo',
id: 111305
}],
},
{
name: '產品顏色',
checkList: [
{
name: '金',
id: 111303
},
{
name: '灰',
id: 111305
}],
},
{
name: '網絡類型',
checkList: [{
name: '套餐一',
id: 111281
},
{
name: '套餐五',
id: 111281
}],
},
]
function arrp(arr){
//編輯原數組格式
if(arr[0].checkList){
arr=arr.map((item)=>{
return item=item.checkList
})
}
if(arr.length == 1){
//最終合併成一個
return arr[0];
}else{ //有兩個子數組就合併
let arrySon = [];
//將組合放到新數組中
arr[0].forEach((item,index)=>{
arr[1].forEach((item1,index1)=>{
arrySon.push([].concat(arr[0][index],arr[1][index1]));
})
})
// 新數組併入原數組,去除合併的前兩個數組
arr[0] = arrySon;
arr.splice(1,1);
// 遞歸
return arrp(arr);
}
}
console.log(arrp(list));
我的想法是把數組中的前兩個屬性先合併出所有可能性,然後併入原數組,之後拿這個數組跟下個數組匹配所有可能性,直到全部合併爲一個數組。
暫時就想到這個,有更好的方法歡迎指出。