Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

146
Visualizações
Cómo agrupar una matriz de datos por su categoría en javascript

Estos son mis datos:

 pets: [{id: 1, name: Susi, species: dog, gender: female},{id: 2, name: Xixi, species: dog, gender: female},{id: 3, name: Boss, species: rabbit, gender: male},{id: 4, name: Bunny, species: rabbit, gender: male},{id: 5, name: kitty, species: cat, gender: female},{id: 6, name: Garfield, species: cat, gender: male}]

¿Cómo puedo transformar estos datos para agrupar a cada mascota según su especie y género de esta manera:

 data: [{species: dog, genders: [{gender: male, pets: [{id: 1, name: Susi, species: dog, gender: female},]}, {gender: female, pets: [{id: 2, name: Xixi, species: dog, gender: female},]}, ]},{species: cat, genders: [{gender: male, pets: [{id: 6, name: Garfield, species: cat, gender: male}]},{gender: female, pets: [{id:5, name: kitty, species: cat, gender: female},]},]},{species: rabbit,genders: [{gender: male, pets: [{id: 3, name: Boss, species: rabbit, gender: male},{id: 4, name: Bunny, species: rabbit, gender: male},]},{gender: female, pets: []},]}]

mi código es:

 const species = pets.reduce((acc, curr) => { let item = acc.find( (item) => item.spesies === curr.species || item.gender === curr.gender ); if (item) { item.genders.push({ gender: curr.gender, pets: [ { id: acc.id, name: curr.name } ] }); } else { acc.push({ species: curr.species genders: [ gender: curr.gender, pets: [ { id: acc.id, name: curr.name } ] ] }); } return acc;}, []);

el resultado de mi código es:

 data: [{species: dog, genders: [{gender: female, pets: Array(1)},{gender: female, pets: Array(1)},]},species: cat, genders: [{gender: male, pets: Array(1)},{gender: female, pets: Array(1)},]},{species: rabbit, genders: [{gender: male, pets: Array(1)},{gender: male, pets: Array(1)}]}]

Espero que el resultado final sea como la segunda matriz anterior. ¿Alguien sabe cómo hacer esto mejor y explicar lo que me estoy perdiendo? ¡¡Gracias!!

about 4 years ago · Juan Pablo Isaza
2 Respostas
Responde à pergunta

0

puedes hacer algo como esto

 const pets = [ {id: 1, name: 'Susi', species: 'dog', gender: 'female'}, {id: 2, name: 'Xixi', species: 'dog', gender: 'female'}, {id: 3, name: 'Boss', species: 'rabbit', gender: 'male'}, {id: 4, name: 'Bunny', species: 'rabbit', gender: 'male'}, {id: 5, name: 'kitty', species: 'cat', gender: 'female'}, {id: 6, name: 'Garfield', species: 'cat', gender: 'male'} ] const data = Object.values(pets.reduce((res, pet) => { const existingSpecies = res[pet.species] || {species: pet.species, genders:{}} const existingGender = existingSpecies.genders[pet.gender] || {gender: pet.gender, pets:[]} return { ...res, [pet.species]: { ...existingSpecies, genders: { ...existingSpecies.genders, [pet.gender]: { ...existingGender, pets: [...existingGender.pets, pet] } } } } }, {})).map(s => ({...s, genders: Object.values(s.genders)})) console.log (data)

about 4 years ago · Juan Pablo Isaza Relatório

0

Creo que visualizando el problema con las imágenes quedó más claro, pero bueno...

De todos modos, escribí la función a continuación, que debería ser la más simple de entender.

 const pets = [ {id: 1, name: 'Susi' , species: 'dog', gender: 'female'}, {id: 2, name: 'Mini' , species: 'dog', gender: 'female'}, {id: 3, name: 'Jojo' , species: 'cat', gender: 'male'}, {id: 4, name: 'Band' , species: 'cat', gender: 'male'}, {id: 5, name: 'Tommy' , species: 'rabbit', gender: 'male'} ] function createNewData(pets){ // newList that we will be constructing const newData = [] //Search in dictionary and get all de Unique Species types const speciesList = pets .map(({ species }) => species) .filter((v, i, a) => a.indexOf(v) === i) //For each unique species that we found in pets for(let i = 0; i < speciesList.length; i++){ //Inside this loop we will construct each specie object const specie = speciesList[i] const newSpeciesObj = {species: specie, genders: [] } //The male list will be inside the maleGenderObj const maleList = [] //The female list will be inside the femaleGenderObj const femaleList = [] for(let i = 0; i < pets.length; i++){ //Inside this loop we add items to the maleList and femaleList, //if they are of the current specie if(pets[i].species == specie) { if (pets[i].gender == 'male'){ maleList.push(pets[i]) } else { femaleList.push(pets[i]) } } } //Here we push the maleGenderObject into genders list newSpeciesObj.genders.push({gender: 'male', pets: maleList}) //Here we push the femaleGenderObject into genders list newSpeciesObj.genders.push({gender: 'female', pets: femaleList}) //We do this for all the species we found at the original data newData.push(newSpeciesObj) } return newData } console.log(createNewData(pets))

¡Actualmente estoy revisando su código para intentar que funcione!

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda