Tengo dos matrices de objetos:
const headers = [ { ID: "1", Header: "General", }, { ID: "2", Header: "Misc", }, ... ] const terms = [ { Header: "General", Term: "Lorem ipsum", Definition: "Lorem ipsum", }, { Header: "General", Term: "Lorem ipsum", Definition: "Lorem ipsum", }, { Header: "Misc", Term: "Lorem ipsum", Definition: "Lorem ipsum", }, { Header: "General", Term: "Lorem ipsum", Definition: "Lorem ipsum", }, { Header: "General", Term: "Lorem ipsum", Definition: "Lorem ipsum", }, { Header: "General", Term: "Lorem ipsum", Definition: "Lorem ipsum", }, ... ]Y me gustaría tener un objeto que tenga cada encabezado como clave y con una matriz de todos los términos como valores:
{ "General: [ { Term: "Lorem ipsum", Definition: "Lorem ipsum", } { Term: "Lorem ipsum", Definition: "Lorem ipsum", }, ... ], "Misc": [ { Term: "Lorem ipsum", Definition: "Lorem ipsum", }, { Term: "Lorem ipsum", Definition: "Lorem ipsum", }, { Term: "Lorem ipsum", Definition: "Lorem ipsum", }, ... ], ... }Supongo que hay una manera de hacerlo con .map .foreach .filter o alguna combinación, pero he estado golpeando una pared todo el día. Incluyendo simplemente tratar de poner el problema en palabras de lo que estoy tratando de hacer aquí para poder encontrar mejores resultados de búsqueda. Cualquier ayuda sería apreciada. ¡Gracias!
Una forma básica de hacerlo si no necesita propiedades adicionales sería:
const outputObj = {} headers.forEach(header => { const headerArr = outputObj[header.Header] = []; terms.forEach(term => { const {Header, Term, Definition} = term; if (Header === header.Header) { headerArr.push({Term, Definition}); } }) })Esto recorrería cada encabezado y agregaría la propiedad Encabezado como una clave con una matriz vacía, luego el segundo ciclo pasaría por los términos y agregaría solo el Término y la Definición (omitiendo el Encabezado).
Puede usar una combinación de reduce y forEach para obtener su resultado. Esto solo tendría que recorrer sus matrices una vez, en lugar de recorrer los terms dos veces, como sucedería con los bucles forEach anidados.
const obj = headers.reduce((a, o) => { a[o.Header] = []; return a; }, {}); terms.forEach(({ Header, ...x }) => obj[Header].push(x)); Explicación: reduce convierte de una matriz a un objeto. Luego forEach recorre y agrega los términos al objeto recién creado.
Aquí hay un ejemplo de trabajo:
const headers = [ { ID: '1', Header: 'General', }, { ID: '2', Header: 'Misc', }, ]; const terms = [ { Header: 'General', Term: 'Lorem ipsum', Definition: 'Lorem ipsum', }, { Header: 'General', Term: 'Lorem ipsum', Definition: 'Lorem ipsum', }, { Header: 'Misc', Term: 'Lorem ipsum', Definition: 'Lorem ipsum', }, { Header: 'General', Term: 'Lorem ipsum', Definition: 'Lorem ipsum', }, { Header: 'General', Term: 'Lorem ipsum', Definition: 'Lorem ipsum', }, { Header: 'General', Term: 'Lorem ipsum', Definition: 'Lorem ipsum', }, ]; const obj = headers.reduce((a, o) => { a[o.Header] = []; return a; }, {}); terms.forEach(({ Header, ...x }) => obj[Header].push(x)); console.log(obj);Puede hacer uso de forEach aquí como:
const dict = {}; headers.forEach(({ Header }) => (dict[Header] = [])); terms.forEach(({ Header, ...rest }) => dict[Header].push(rest)); console.log(dict); const headers = [ { ID: "1", Header: "General", }, { ID: "2", Header: "Misc", }, ]; const terms = [ { Header: "General", Term: "Lorem ipsum", Definition: "Lorem ipsum", }, { Header: "General", Term: "Lorem ipsum", Definition: "Lorem ipsum", }, { Header: "Misc", Term: "Lorem ipsum", Definition: "Lorem ipsum", }, { Header: "General", Term: "Lorem ipsum", Definition: "Lorem ipsum", }, { Header: "General", Term: "Lorem ipsum", Definition: "Lorem ipsum", }, { Header: "General", Term: "Lorem ipsum", Definition: "Lorem ipsum", }, ]; const dict = {}; headers.forEach(({ Header }) => (dict[Header] = [])); terms.forEach(({ Header, ...rest }) => dict[Header].push(rest)); console.log(dict);