笛卡爾積:電商中sku規格屬性算法

前兩天做電商前端的朋友問我,根據產品屬性,顯示出所有不同屬性產品,屬性是動態的。
這是電商中經常會遇到的笛卡爾積問題。

例如一個手機有金色,白色。內存有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));

我的想法是把數組中的前兩個屬性先合併出所有可能性,然後併入原數組,之後拿這個數組跟下個數組匹配所有可能性,直到全部合併爲一個數組。
暫時就想到這個,有更好的方法歡迎指出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章