¿Cómo puedo convertir un nestedArray en una matriz de objetos en función de los valores de la matriz anidada? Aquí hay un ejemplo:
const nestedArray = [{ id: "Degree", options: ["HighSchool", "Undergraduate", "Bachelor", "Master", "Doctor"] }, { id: "gender", options: ["male", "female"] }] const arrayOfObjects = [] nestedArray[0].options.map((degree) => { nestedArray[1].options.map((gender) => { let currObject = {} currObject[nestedArray[0].id] = degree currObject[nestedArray[1].id] = gender arrayOfObjects.push(currObject) }) }) console.log(arrayOfObjects)pero el problema con eso es que a veces mi matriz anidada consistirá en otra matriz anidada llamada edad, por ejemplo. ¿Cómo puedo hacer que esto sea "universal" en cierto sentido? Violín: https://jsfiddle.net/j2v4L918/15/
Parece que estás buscando el producto cartesiano . Aquí hay un ejemplo que usa una de las respuestas de esta pregunta: producto cartesiano de múltiples matrices en JavaScript .
/** * @see https://stackoverflow.com/questions/12303989/cartesian-product-of-multiple-arrays-in-javascript */ const cartesian = (...a) => a.reduce((a, b) => a.flatMap(d => b.map(e => [d, e].flat()))); const nestedArray = [ { id: "Degree", options: ["HighSchool", "Undergraduate", "Bachelor", "Master", "Doctor"] }, { id: "gender", options: ["male", "female"] }, { id: "subject", options: ["spanish", "geometry"] } ]; const arrayOfEntries = nestedArray.map(({ id, options }) => options.map(option => ({ [id]: option }))); const cartesianProduct = cartesian(...arrayOfEntries); const arrayOfObjects = cartesianProduct.map(arr => Object.assign({}, ...arr)) console.log(arrayOfObjects);El fragmento anterior comienza asignando su matriz de objetos de opción a una matriz de objetos individuales usando propiedades calculadas :
[ { id: "gender", options: ["male", "female"] }, { id: "subject", options: ["spanish", "geometry"] } ]; // mapped to individual objects: {[id]: option} [ [ { gender: 'male' }, { gender: 'female' } ], [ { subject: 'spanish' }, { subject: 'geometry' } ] ]Luego toma el producto cartesiano de estas entradas:
// cartesian product of individual objects [ [ { gender: 'male' }, { subject: 'spanish' } ], [ { gender: 'male' }, { subject: 'geometry' } ], [ { gender: 'female' }, { subject: 'spanish' } ], [ { gender: 'female' }, { subject: 'geometry' } ] ] Finalmente, map() sobre esta matriz y fusionamos los objetos individuales pasándolos a Object.assign asegurándonos de asignarlos a un objeto vacío y usando la sintaxis extendida (...) para expandir la submatriz de objetos.
Object.assign({}, ...[{ gender: 'male' }, { subject: 'spanish' }]) // ^^ assign into empty object to avoid reference problems