Así que actualmente tengo esta estructura de matriz:
const object = { object1: ["01", "02"], object2: ["item1", "item2", "item3"], object3: ["product1", "product2"] }y necesito transformarlo a:
const array = [ { object1: "01", object2: "item1", object3: "product1", }, { object1: "02", object2: "item1", object3: "product1", }, { object1: "01", object2: "item2", object3: "product1", }, { object1: "01", object2: "item3", object3: "product1", }, { object1: "02", object2: "item2", object3: "product1", }, { object1: "02", object2: "item3", object3: "product1", }, { object1: "01", object2: "item1", object3: "product2", }, { object1: "02", object2: "item1", object3: "product2", }, { object1: "02", object2: "item2", object3: "product2", }, { object1: "03", object2: "item2", object3: "product2", }, ]Entonces, básicamente, necesito crear una nueva matriz basada en cada combinación en el objeto inicial de las matrices, y la matriz inicial estará en los miles de elementos.
Esto es lo que tengo hasta ahora, pero no tuve suerte al obtener la estructura que necesito.
const object = { object1: ["01", "02"], object2: ["item1", "item2", "item3"], object3: ["product1", "product2"] } const arr = [] Object.entries(object).forEach((element, i) => { element.forEach((innerElement, j) => { let _element = {[`${element[0]}`]:element[1][j]} arr.push(_element) }) }); console.log("map", arr)¿Hay alguna forma de transformar los datos a la estructura que necesito? ¡Gracias por adelantado!
Sugeriría crear una solución genérica que repita las posibles propiedades y valores del object de plantilla y cree una matriz de todos los resultados posibles.
Crearíamos una función addPossibleValues() que expandirá la matriz de objetos para cada clave en el objeto de plantilla. Cada ronda aumentará el número de objetos por la longitud sucesiva de la matriz de propiedad relevante.
const object = { object1: ["01", "02"], object2: ["item1", "item2", "item3"], object3: ["product1", "product2"] } function addPossibleValues(arr, property, possibleValues) { return possibleValues.flatMap(v => { return (arr.length ? arr: [{}]).map(x => { return { ...x, [property]: v}; }) }); } let result = []; for(let key in object) { result = addPossibleValues(result, key, object[key]); } console.log('Result:', result) .as-console-wrapper { max-height: 100% !important; } También puede hacer esto usando una llamada Array.reduce() :
const object = { object1: ["01", "02"], object2: ["item1", "item2", "item3"], object3: ["product1", "product2"] } function addPossibleValues(arr, property, possibleValues) { return possibleValues.flatMap(v => { return (arr.length ? arr: [{}]).map(x => { return { ...x, [property]: v}; }) }); } let result = Object.keys(object).reduce((acc, key) => { return addPossibleValues(acc, key, object[key]); }, []); console.log('Result:', result) .as-console-wrapper { max-height: 100% !important; }Ocurrencia
Generación paso a paso del producto cruzado de las matrices en el objeto original:
Iterar a través de todas las propiedades del objeto original.
Considere alguna iteración.
Supongamos que tenemos una matriz provisional llena en las iteraciones anteriores
Para cada uno de los valores cv de la matriz almacenada como la propiedad cp de la iteración actual en el objeto original...
cp al objeto clonado y rellénelo con el valor cv .Concluya la iteración eliminando los originales de la operación de conificación de la matriz de resultados (estos ahora están obsoletos porque son el producto cruzado de una dimensión menos).
Inicialice el procedimiento while con una matriz con un solo objeto vacío
Código
const object = { object1: ["01", "02"], object2: ["item1", "item2", "item3"], object3: ["product1", "product2"] } let a_res = [{}]; for (s_key in object) { let n_currentCount = a_res.length ; object[s_key].forEach ( ps_item => { for (let i = 0; i < n_currentCount; i++) { let o_new = Object.assign({ [s_key]: ps_item }, a_res[i]) ; a_res.push(o_new); } }); a_res.splice(0, n_currentCount); // in situ } console.log(a_res);Primero, debo disculparme por mi inglés. Podrías usar 3 forEach anidados.
const object = { object1: ["01", "02"], object2: ["item1", "item2", "item3"], object3: ["product1", "product2"] } var arr = [] object.object3.forEach(o3 => object.object2.forEach(o2 => object.object1.forEach(o1 => arr.push({object1: o1, object2: o2, object3: o3})))); console.log(arr);Cambia el orden de forEach si prefieres cambiar el orden de las combinaciones