Muy bien, sé que hay algunas publicaciones sobre cómo obtener el producto de una cantidad desconocida de matrices con una cantidad desconocida de elementos:
JavaScript: generación de combinaciones a partir de n matrices con m elementos
Matriz cartesiana basada en una matriz de objetos en Javascript
Por nombrar algunos, sin embargo, necesito un ligero giro.
Lo que me gustaría es una función que pueda generar una matriz de objetos serializados en lugar de una matriz de matrices.
por ejemplo, si la entrada de la función fuera -
scenarioBuilder({ENV: ["QA","UAT"], HOST: ["APP1", "APP2", "APP3"], API: ["Example1", "Example2"]})La salida sería una matriz de objetos serializados como este:
[{ENV: "QA", HOST: "APP1", API: "Example1"}, {ENV: "UAT", HOST: "APP1", API: "Example1"}, {ENV: "QA", HOST: "APP2", API: "Example1"}, {ENV: "UAT", HOST: "APP2", API: "Example1"}, {ENV: "QA", HOST: "APP3", API: "Example1"}, {ENV: "UAT", HOST: "APP3", API: "Example1"}]etc etc etc etc
Esencialmente, tomando la matriz de ENV, HOSTS Y API, y creando un generador de escenarios serializados.
He intentado algunas grietas para adaptar algunos de los métodos de los enlaces anteriores, pero no he tenido suerte.
específicamente -
function cartesian(...args) { var r = [], max = args.length-1; function helper(arr, i) { for (var j=0, l=args[i].length; j<l; j++) { var a = arr.slice(0); // clone arr a.push(args[i][j]); if (i==max) r.push(a); else helper(a, i+1); } } helper([], 0); return r; }Pero Javascript no es mi idioma principal y, sinceramente, no tengo ni idea de cómo separar las matrices y volver a ensamblar los objetos.
¿Alguien puede intentarlo?
Gracias, como siempre.
esto es solo un asunto recursivo ...
const data = { ENV : [ 'QA', 'UAT' ] , HOST: [ 'APP1', 'APP2', 'APP3' ] , API : [ 'Example1', 'Example2' ] } const scenarioBuilder = objXarr => { let names = Object.keys( objXarr ) , len = names.length -1 , resp = [] ; buildIn( {}, 0) return resp function buildIn(obj, indx) { let key = names[indx] for (let val of objXarr[ key ] ) { let oo = {...obj,[key]:val} if (indx < len ) buildIn(oo, indx +1) else resp.push( oo ) } } } console.log( scenarioBuilder( data ) ) .as-console-wrapper {max-height: 100%!important;top:0 }