Básicamente, recibo un conjunto de datos como el que proporcioné a continuación y, sin embargo, todos siguen el mismo patrón y tienen la misma cantidad de claves y valores; Estoy buscando agruparlos de manera que la "creación" permanezca igual, y si la matriz tiene más objetos con la misma "creación", los valores del "modelo" se insertan en una matriz como se muestra en el ejemplo 2.
He intentado usar un bucle, pero no pude encontrar la manera de producir 2 matrices diferentes para una sola marca.
const cars = [ { 'make': 'audi', 'model': 'r8', 'year': '2012' }, { 'make': 'audi', 'model': 'rs5', 'year': '2013' } ];Y aquí está el resultado final que estoy buscando:
const carByMake = [ { 'make': 'audi', 'models': ['r8', 'rs5'] 'years': ['2012, 2013'] }, ];puedes hacer esto
const cars = [ { make: "audi", model: "r8", year: "2012", }, { make: "audi", model: "rs5", year: "2013", }, { make: "audi", model: "rs6", year: "2013", }, { make: "bmw", model: "x5", year: "2013", }, { make: "bmw", model: "x6", year: "2013", }, ]; let tempArr = []; let unique = cars.map((data) => { let filterDataArr = tempArr.filter( (filterData) => filterData.make == data.make ); if (filterDataArr && filterDataArr.length > 0) { filterDataArr[0].models = [...filterDataArr[0].models, data.model]; filterDataArr[0].years = [...filterDataArr[0].years, data.year]; } else { let dataArr = { make: data.make, models: [data.model], years: [data.year], }; tempArr.push(dataArr); } }); console.log("tempArr=>", tempArr);Hay una forma más fundamental de hacer lo que pides.
Este es un problema muy básico, y debe resolverse usando una solución básica. No es necesario filtrar los resultados, ya que un ciclo simple con una declaración if puede producir los resultados que solicita. Fundamentalmente, la solución para este problema es técnicamente un algoritmo de clasificación, muy simple.
Podría usar un ciclo "for of" , pero creo que este es un excelente ejemplo en el que un ciclo forEach muestra cuán poderoso es. ForEach se abstrae un nivel por encima de sus bucles while & for de nivel bajo. Esa capa extra de abstracción permite pasar una función al bucle forEach. Cada vez (de ahí el nombre "cada uno"), el ciclo forEach itera, se ejecuta la devolución de llamada de forEach, hasta que la matriz a la que se llamó el ciclo forEach se haya iterado por completo (hay excepciones, pero no quiero bajarme pista).
Puede usar el ciclo forEach para resolver su problema. Esa solución se demuestra a continuación. Documenté el código con JSDoc para que pueda copiarlo y pegarlo en su editor, y mostrar los parámetros y tipos en su información sobre herramientas/widget flotante.
const cars = [ { make: 'audi', model: 'r8', year: 2012 }, { make: 'audi', model: 'rs5', year: 2013 }, ]; /** * @param {string} make - The make that you want to return the models & years for * @param {{make: string, model: string, year: number}[]} cars - An array of car objects that include the model make & year * @return {{make: string, models: string[], years: string[]}} * */ function sortByMake(make, cars) { const models = []; const years = []; cars.forEach((car) => { if (car.make.toLowerCase() === make.toLowerCase()) { models.push(car.model); years.push(car.year); } }); return { make: make, models: models, years: years }; } console.log(sortByMake('Audi', cars)); // OUTPUT: // $ node ./index.js // {make: 'Audi', models: ['r8', 'rs5'], years: [2012, 2013]}