递归构造不定长数组的组合

需求描述:现有一个不定长的数组,里面包含多个维度的信息,求所有的组合

简单说这个需求就是类似电商平台买鞋子,假设鞋子A有两个颜色,分别为红色和白色,有三种尺码,分别为37、38和39,那这样就会有如下6种组合:

1.红色37码

2.红色38码

3.红色39码

4.白色37码

5.白色38码

6.白色39码

如上的例子中只有两个维度,颜色和尺码,当前的需求是要算出不固定维度下的所有组合情况,js代码实现如下:

//当前遍历的索引
var curIndex = 0;
//结果集
var resultArr = [];
//json字符串转换为对象
var allArr = JSON.parse('[{"propId":1530252475744,"propName":"颜色","addImgFlag":false,"valList":[{"valName":"亮黑","picUrl":"","valId":1530252475745},{"valName":"磨砂黑","picUrl":"","valId":1530252490595}]},{"propId":1530252485722,"propName":"度数","addImgFlag":false,"valList":[{"valName":"+100","picUrl":"","valId":1530252485723},{"valName":"+150","picUrl":"","valId":1530252539246}]},{"propId":1530252475744,"propName":"大小","addImgFlag":false,"valList":[{"valName":"","picUrl":"","valId":1530252475745},{"valName":"","picUrl":"","valId":1530252490595}]},{"propId":1530252475744,"propName":"方向","addImgFlag":false,"valList":[{"valName":"","picUrl":"","valId":1530252475745},{"valName":"","picUrl":"","valId":1530252490595},{"valName":"","picUrl":"","valId":1530252490595}]}]');
//var allArr = JSON.parse('[{"propId":1530252475744,"propName":"颜色","addImgFlag":false,"valList":[{"valName":"亮黑","picUrl":"","valId":1530252475745},{"valName":"磨砂黑","picUrl":"","valId":1530252490595},{"valName":"红色","picUrl":"","valId":1530252491278},{"valName":"紫色","picUrl":"","valId":1530252491790},{"valName":"粉色","picUrl":"","valId":1530252492258}]},{"propId":1530252485722,"propName":"度数","addImgFlag":false,"valList":[{"valName":"+100","picUrl":"","valId":1530252485723},{"valName":"+150","picUrl":"","valId":1530252539246},{"valName":"+200","picUrl":"","valId":1530252539697},{"valName":"+250","picUrl":"","valId":1530252540265},{"valName":"+300","picUrl":"","valId":1530252540721},{"valName":"+350","picUrl":"","valId":1530252541185},{"valName":"+400","picUrl":"","valId":1530252542069}]}]');
structureResult('');
console.info(resultArr);

/**
 * 递归构造结果集
 */
function structureResult(result) {
    var map = allArr[curIndex];
    if(map != null) {
        //颜色/型号...列表
        var list = map.valList;
        //这层循环的临时结果
        var curResult = result;
        //这层循环的索引
        var curIndexTemp = curIndex;
        $.each(list, function (index, item) {
            if(curResult == ''){
                result = item.valName;
            } else {
                result = curResult + ',' + item.valName;
            }
            //如果循环的是最后一层, 那就添加到结果集
            if(curIndex == allArr.length - 1) {
                resultArr.push(result);
            } else {
                curIndex++;
                //不是最后一层, 继续递归调用
                structureResult(result);
            }
            //当前循环的最后一个元素
            if(index == list.length - 1) {
                curIndex = curIndexTemp - 1;
            }
        });
    }
}

猜你喜欢

转载自blog.csdn.net/u012279312/article/details/80944515