Creé este script debido a la necesidad de realizar combinaciones únicas cuando recibo n números de matrices. Funciona, sin embargo, cuando quiero almacenar en una matriz final, escribe algo diferente.
let options = { "A": ["A1", "A2", "A3", "A4"], "B": ["B1", "B2"], "C": ["C1", "C2", "C3", "C4", "C5"], }; let keys = Object.getOwnPropertyNames(options); let size = keys.length; let final = []; function combinate(n, o) { for (let i = 0; i < options[keys[n]].length; i++) { if (n === (size - 1)) { o = {}; } o[keys[n]] = options[keys[n]][i]; if ((n - 1) >= 0) { combinate(n - 1, o); } if (n === 0) { console.log(o); final.push(o); } } } if (size > 0) combinate(size - 1, {}); console.log("-----------------------------------") console.log(final);Está guardando una referencia al mismo objeto varias veces en su matriz y haciendo cambios en ese objeto. Debe colocar una nueva copia del objeto en la matriz.
Cambio: final.push(o); a final.push(Object.assign({}, o));
O, más directamente: final.push({A:oA, B:oB, C:oC});
Debe pasar la referencia del objeto a la función y luego copiar el objeto modificado a la matriz final
let options = { "A": ["A1", "A2", "A3", "A4"], "B": ["B1", "B2"], "C": ["C1", "C2", "C3", "C4", "C5"], }; let keys = Object.getOwnPropertyNames(options); let size = keys.length; let final = []; function combinate(n, o, fooFinal) { for (let i = 0; i < options[keys[n]].length; i++) { if (n === (size - 1)) { o = {}; } o[keys[n]] = options[keys[n]][i]; if ((n - 1) >= 0) { combinate(n - 1, o, fooFinal); } if (n === 0) { console.log(o); fooFinal.push(o); } } if(n===size-1){ return fooFinal; } } if (size > 0){ final = combinate(size - 1, {},[]); } console.log("-----------------------------------") console.log(final);