0
votes

Comment convertir un tableau d'objets en un objet (dynamiquement) dans JavaScript

J'ai un tableau d'objets qui ressemble à ceci: xxx

J'essaie de le convertir en quelque chose comme ceci: xxx

J'ai essayé le suivant xxx

et cela fonctionne bien, mais cela suppose que vous connaissez déjà, à l'avance, les touches des objets que vous convertissez. < p> Je veux pouvoir charger de manière dynamique des clés d'objet et des valeurs correspondantes. En supposant que je ne sais pas que les objets de notre exemple de tableau ont "nom" et "Âge" comme des clés.


0 commentaires

6 Réponses :


1
votes

Vous pouvez réduire le tableau et les entrées de l'objet et collecter les valeurs dans le groupe des touches.

p>

.as-console-wrapper { max-height: 100% !important; top: 0; }


0 commentaires

0
votes

Vous pouvez obtenir la clé du premier élément, puis sur la carte. Avec chacun, obtenez ses valeurs correspondantes

p>

const arr = [
  { name: "john", age: 23, gender: "male" },
  { name: "mary", age: 40, gender: "female" },
  { name: "zack", age: 17, gender: "male" },
]

const res = Object.keys(arr[0]).reduce((acc, el) => {
  const values = arr.map((item) => item[el])
  return { ...acc, [el]: values }
}, {})

console.log(res)


1 commentaires

Une seule chose avec cette approche est comme, pour une raison quelconque si le premier objet ne présente pas certaines des clés (par exemple, considérer sexe n'est pas présent dans arr [0] ), il pourrait ne pas être présent dans la sortie du tout.



0
votes

En supposant que chaque objet de votre liste ait les mêmes clés que vous pouvez obtenir les touches du premier objet xxx pré>

puis plantez les touches avec votre approche ci-dessus P>

const returnObj = {}
keys.forEach(key => {
   returnObj[key] = arr.map(item => item[key])
})
return returnObj


0 commentaires

0
votes

Vous pouvez utiliser objet.entries code> pour le mappage.

p>

var arr = [
  {name: "john", age: 23},
  {name: "mary", age: 40},
  {name: "zack", age: 17}
];

var entries = arr.map((item) => Object.entries(item));

var result = {};
entries.forEach(entry => {
  entry.forEach(item => {
    if (result[item[0]] && result[item[0]].length > 0) {
      result[item[0]].push(item[1]);
    } else {
        result[item[0]] = [item[1]];
    }
  });
});
console.log(result);


0 commentaires

0
votes

Vous pouvez utiliser array.reduce code> et objet.keys code>.

p>

let arr = [
  {name: "john", age: 23},
  {name: "mary", age: 40},
  {name: "zack", age: 17}
]

const formatData = (data) => {
  return data.reduce((res, obj) => {
    Object.keys(obj).map(d => {
      res[d] = [...(res[d] ||[]), obj[d]]
    })
    return res;
  }, {})
}

console.log(formatData(arr))


0 commentaires

0
votes

Vous pouvez le faire avec RAMDA

import { mergeWith, concat } from “Ramda”

const mergeConcat = mergeWith(concat)

mergeConcat(arr)


0 commentaires