需求描述:现有一个不定长的数组,里面包含多个维度的信息,求所有的组合
简单说这个需求就是类似电商平台买鞋子,假设鞋子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; } }); } }