笛卡尔积的函数
function multiCartesian(specs) {
if (!specs || specs.length == 0) {
return [];
} else {
return joinSpec([[]], specs, 0, specs.length - 1);
}
function joinSpec(prevProducts, specs, i, max) {
var currentProducts = [], currentProduct, currentSpecs = specs[i];
if (i > max) {
return prevProducts;
}
prevProducts.forEach(function (prevProduct) {
currentSpecs.forEach(function (spec) {
currentProduct = prevProduct.slice(0);
currentProduct.push(spec);
currentProducts.push(currentProduct);
});
});
return joinSpec(currentProducts, specs, ++i, max);
}
}
var originArray = [[111,222,333],['aaa','bbb','ccc'],['*****','++++++']];
console.dir(multiCartesian(originArray))
结果
[[111,"aaa","*****"],[111,"aaa","++++++"],[111,"bbb","*****"],
[111,"bbb","++++++"],[111,"ccc","*****"],[111,"ccc","++++++"],
[222,"aaa","*****"],[222,"aaa","++++++"],[222,"bbb","*****"],
[222,"bbb","++++++"],[222,"ccc","*****"],[222,"ccc","++++++"],
[333,"aaa","*****"],[333,"aaa","++++++"],[333,"bbb","*****"],
[333,"bbb","++++++"],[333,"ccc","*****"],[333,"ccc","++++++"]]