笛卡尔积:电商中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));

我的想法是把数组中的前两个属性先合并出所有可能性,然后并入原数组,之后拿这个数组跟下个数组匹配所有可能性,直到全部合并为一个数组。
暂时就想到这个,有更好的方法欢迎指出。

你可能感兴趣的:(js)