3 votes

Aplatir un tableau d'objets imbriqués

J'ai des données comme celles-ci :

data = [
  {
    "foo": {"name":"foo-name"},
    "bar": {"name":"bar-name"}
  },
  {
    "baz": {"name":"baz-name"}
  }
]

et le résultat que je souhaite obtenir est le suivant :

[
  { "foo": {"name":"foo-name"}},
  { "bar": {"name":"bar-name"}},
  { "baz": {"name":"baz-name"}}
]

Comment obtenir cette structure ? J'ai essayé d'utiliser concat mais s'est rendu compte que cela ne fonctionnait pas car il s'agit d'objets imbriqués et non de tableaux imbriqués. J'ai ensuite essayé d'itérer de différentes manières, mais je n'ai pas obtenu ce que je voulais. Un essai a été le suivant :

const newData = data.map((x) => {
  return Object.keys(x).map(el => {
    return {[el]: x};
  })
})

Mais cela n'a fait que l'emboîter davantage.

4voto

Code Maniac Points 29570

Vous pouvez utiliser flatMap

let data = [{"foo": {"name":"foo-name"},"bar": {"name":"bar-name"}},{"baz": {"name":"baz-name"}}]

let final = data.flatMap(a => Object.entries(a).map(([k, v]) => ({
  [k]: v
})))

console.log(final)

3voto

CertainPerformance Points 110949

Une option consiste à reduce dans un tableau, en itérant sur les entrées de chaque objet et en les poussant dans l'accumulateur :

const data = [
  {
    "foo": {"name":"foo-name"},
    "bar": {"name":"bar-name"}
  },
  {
    "baz": {"name":"baz-name"}
  }
];

const output = data.reduce((a, obj) => {
  Object.entries(obj).forEach(([key, val]) => {
    a.push({ [key]: val });
  });
  return a;
}, []);
console.log(output);

2voto

T.J. Crowder Points 285826

J'utiliserais un simple for-of con Object.entries mappés sur des objets :

const result = [];
for (const obj of data) {
    result.push(
        ...Object.entries(obj).map(
            ([key, value]) => ({[key]: value})
        )
    );
}

Exemple en direct :

const data = [
  {
    "foo": {"name":"foo-name"},
    "bar": {"name":"bar-name"}
  },
  {
    "baz": {"name":"baz-name"}
  }
];
const result = [];
for (const obj of data) {
    result.push(
        ...Object.entries(obj).map(
            ([key, value]) => ({[key]: value})
        )
    );
}
console.log(result);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X