Open Mardanjan opened 4 years ago
function calcDescartes (array) { if (array.length < 2) return array[0] || []; return [].reduce.call(array, function (col, set) { var res = []; col.forEach(function (c) { console.log('c:', c) set.forEach(function (s) { console.log('s:', s) var t = [].concat(Array.isArray(c) ? c : [c]); t.push(s); res.push(t); console.log('t:', t) console.log('res:', res) }) }); return res; }); }
console.log(calcDescartes([[1,2,3],['a','b','c'], ['m','n']]));
+ 我自己的代码。虽然长一点但是很清晰
function decard (array) { if (array.length === 0) { return [] } else if (array.length === 1) { return array } else { for(var i = 0; i < array.length - 1; i++) { var newArray = [] // 两个元素排列组合后生成的数组 array[i].map(item1 => { array[i + 1].map(item2 => { var tempArray = [] // 临时数组,两个元素合到一起,最终会成为newArray的元素 if (Array.isArray(item1)) { // 两个元素的排列组合结果会代替第二个原 item1.map(itm => { // 这样的话第二个元素与第三个元素的排列组合就是 tempArray.push(itm) // 第一个元素和第二个元素的排列组合的结果和第三个元素的排列组合 }) } else { tempArray.push(item1) } tempArray.push(item2) // 第二个元素是新的,并不是数组 newArray.push(tempArray) }) }) array[i+1] = newArray } return array.pop() // 以此类推,最后一个元素会成为最终的排列组合结果 } } console.log(decard([[1,2],['a','b'],['c','d'],['!','$','#']])) console.log(decard([[1,2],['a','b'],['c','d'],['!','$','#']]).length)
用蛮力法暴力计算了一下,别人的代码太美太短,看了一会有点看不懂,自己写了一个
console.log(calcDescartes([[1,2,3],['a','b','c'], ['m','n']]));
function decard (array) { if (array.length === 0) { return [] } else if (array.length === 1) { return array } else { for(var i = 0; i < array.length - 1; i++) { var newArray = [] // 两个元素排列组合后生成的数组 array[i].map(item1 => { array[i + 1].map(item2 => { var tempArray = [] // 临时数组,两个元素合到一起,最终会成为newArray的元素 if (Array.isArray(item1)) { // 两个元素的排列组合结果会代替第二个原 item1.map(itm => { // 这样的话第二个元素与第三个元素的排列组合就是 tempArray.push(itm) // 第一个元素和第二个元素的排列组合的结果和第三个元素的排列组合 }) } else { tempArray.push(item1) } tempArray.push(item2) // 第二个元素是新的,并不是数组 newArray.push(tempArray) }) }) array[i+1] = newArray } return array.pop() // 以此类推,最后一个元素会成为最终的排列组合结果 } } console.log(decard([[1,2],['a','b'],['c','d'],['!','$','#']])) console.log(decard([[1,2],['a','b'],['c','d'],['!','$','#']]).length)