web-dev-qa-db-fra.com

opérateur de propagation conversion d'objets en tableau

J'essaie de convertir une structure de données comme celle-ci:

data = { 
  0:{A:a}, 
  1:{B:b}, 
  2:{C:c}, 
}

dans une structure comme celle-ci:

[
 {0:{A:a}},
 {1:{B:b}}, 
 {2:{C:c}},
]

Utilisation de l'opérateur d'étalement comme ceci: [...data] renvoie tout tableau vide.

J'ai aussi essayé [{...data}]

Existe-t-il un moyen d'utiliser l'opérateur d'étalement pour obtenir le résultat souhaité? Aussi, pourquoi cette approche ne fonctionne-t-elle pas?

12
Turnipdabeets

Cela ne fonctionne pas car selon les documents MDN

"Les propriétés Rest/Spread pour la proposition ECMAScript (étape 3) ajoutent des propriétés réparties aux littéraux d'objet. Il copie les propres propriétés énumérables d'un objet fourni sur un nouvel objet . "

Vous pouvez faire ce que vous essayez de faire très facilement avec Object.keys().map().

var data = { 
  0:{A:"a"}, 
  1:{B:"b"}, 
  2:{C:"c"}, 
}

var result = Object.keys(data).map(function (key) {
   return { [key]: data[key] };
});
console.log(result);
7
mhodges

Vous pouvez utiliser Object.entries pour obtenir des paires [clé, valeur] et les mapper à un tableau d'objets en utilisant noms de propriété calculés :

const data = { 
  0:{A: 'a'}, 
  1:{B: 'b'}, 
  2:{C: 'c'}
};

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

console.log(result);
5
Ori Drori

Je crains que vous ne puissiez pas utiliser l'opérateur de propagation comme dans votre exemple, mais vous pouvez produire la sortie souhaitée avec reduce.

data = { 
  0:{A:'a'}, 
  1:{B:'b'}, 
  2:{C:'c'}, 
}

let resArr = Object.keys(data).reduce((arr, e) => {
  arr.Push({[e]: data[e]});
  return arr;
}, []);

console.log(resArr);
1
Olian04