Tengo una matriz de objetos y cada objeto tiene múltiples opciones, ¿cómo convertirlo en múltiples objetos según el recuento de opciones?
Aporte:
var arr = [{name: "audio", options:[{name:'true', value: 'T'},{name:'false', value: 'F'},{name:'yes', value: 'Y'}]}, {name: "video", options:[{name:'true', value: 'T'},{name:'false', value: 'F'},{name:'yes', value: 'Y'}]}, {name: "call", options:[{name:'true', value: 'T'},{name:'false', value: 'F'},{name:'yes', value: 'Y'}]}] const res = Object.values(arr.reduce((acc,{name, options})=>{ acc[name] = acc[name] || {name, options: []}; acc[name].options.push(options); return acc; }, {})); console.log(res) .as-console-wrapper { max-height: 100% !important; }Rendimiento esperado:
[{name: "audio", options:{name:'true', value: 'T'}}, {name: "audio", options:{name:'false', value: 'F'}}, {name: "audio", options:{name:'yes', value: 'Y'}}, {name: "video", options:{name:'true', value: 'T'}}, {name: "video", options:{name:'yes', value: 'Y'}}, {name: "video", options:{name:'false', value: 'F'}}, {name: "call", options:{name:'true', value: 'T'}}, {name: "call", options:{name:'No', value: 'N'}}, {name: "call", options:{name:'false', value: 'F'}}]Puedes hacer esto con un mapa plano
const arr = [{"name":"audio","options":[{"name":"true","value":"T"},{"name":"false","value":"F"},{"name":"yes","value":"Y"}]},{"name":"video","options":[{"name":"true","value":"T"},{"name":"false","value":"F"},{"name":"yes","value":"Y"}]},{"name":"call","options":[{"name":"true","value":"T"},{"name":"false","value":"F"},{"name":"yes","value":"Y"}]}] const res = arr.flatMap(({ options, ...props }) => options.map(options => ({ ...props, options }))) console.log(res) .as-console-wrapper { max-height: 100% !important; } Esto crea una matriz de matrices para cada options de la colección y luego la aplana para producir una matriz unidimensional.
La sintaxis extendida le permite fusionar cualquier propiedad de nivel superior (como name ) en cada resultado de opción
Necesita un bucle anidado sobre la matriz de options para dividirlos en elementos de matriz separados.
var arr = [{name: "audio", options:[{name:'true', value: 'T'},{name:'false', value: 'F'},{name:'yes', value: 'Y'}]}, {name: "video", options:[{name:'true', value: 'T'},{name:'false', value: 'F'},{name:'yes', value: 'Y'}]}, {name: "call", options:[{name:'true', value: 'T'},{name:'false', value: 'F'},{name:'yes', value: 'Y'}]}] const res = []; arr.forEach(({ name, options }) => options.forEach(option => res.push({ name, options: option }))); console.log(res)Use Array.map para crear los elementos convertidos, luego use Array.flat para aplanar la matriz 2D.
var arr = [{name: "audio", options:[{name:'true', value: 'T'},{name:'false', value: 'F'},{name:'yes', value: 'Y'}]}, {name: "video", options:[{name:'true', value: 'T'},{name:'false', value: 'F'},{name:'yes', value: 'Y'}]}, {name: "call", options:[{name:'true', value: 'T'},{name:'false', value: 'F'},{name:'yes', value: 'Y'}]}] let output = arr.map(it => { return it.options.map(option => { return {name:it.name,options:option} }) }).flat() console.log(output);Editar:
Como mencionó @mplungjan, esto es idéntico a usar Array.flatMap .
var arr = [{name: "audio", options:[{name:'true', value: 'T'},{name:'false', value: 'F'},{name:'yes', value: 'Y'}]}, {name: "video", options:[{name:'true', value: 'T'},{name:'false', value: 'F'},{name:'yes', value: 'Y'}]}, {name: "call", options:[{name:'true', value: 'T'},{name:'false', value: 'F'},{name:'yes', value: 'Y'}]}] let output = arr.flatMap(it => { return it.options.map(option => { return {name:it.name,options:option} }) }); console.log(output);