web-dev-qa-db-fra.com

lodash - projeter / transformer un objet en tableau de valeurs clés

Je suis sur le point d'utiliser forOwn pour parcourir les propriétés d'un objet et créer un tableau manuellement et je ne peux m'empêcher de penser qu'il existe un oneliner déjà disponible pour le faire.

{ 
  prop1 : "value",
  prop2: { sub:1}
}

à:

[ 
   {key: "prop1", value: "value"},
   {key: "prop2", value: {sub:1}}
]

Merci

23
sambomartin

Vous pouvez utiliser _. Map () de lodash avec noms de propriété abrégés :

const obj = { 
  prop1 : "value",
  prop2: { sub:1}
};

const result = _.map(obj, (value, prop) => ({ prop, value }));

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.2/lodash.min.js"></script>

Ou vous pouvez le faire en utilisant Object#entries avec Array.map() et déstructuration du tablea :

const obj = { 
  prop1 : "value",
  prop2: { sub:1}
};

const result = Object.entries(obj).map(([prop, value]) => ({ prop, value }));

console.log(result);
31
Ori Drori

Vous n'avez même pas besoin de lodash pour ça:

var arr = Object.keys(obj).map(function(key){
  return { key: key, value: obj[key] };
});
10
Joseph

Un peu d'ES6:

_.map( obj, (value, key) => ({key,value}) )

10
Dzianis Sudas

Si vous utilisez lodash/fp vous pouvez utiliser _.entries

const a = { one: 123, two: { value: 'b' }};

const pairs = _.entries(a).map(p => ({ key:p[0], value: p[1] }))

console.log(pairs)
// [
//   {
//     "key": "one",
//     "value": 123
//   },
//   {
//     "key": "two",
//     "value": {
//       "value": "b"
//     }
//   }
// ]
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash-fp/4.15.0/lodash-fp.js"></script>
3
Marcelo Lazaroni

Vous pouvez utiliser pairs si cela correspond à votre cas:

_.pairs({ 'barney': 36, 'fred': 40 });
// → [['barney', 36], ['fred', 40]]

Réf: https://lodash.com/docs#pairs

2
Skarllot

En réponse au commentaire d'Ori et pour être complet, j'ai publié la version _.forOwn. C'est légèrement plus rapide, mais vous devez d'abord déclarer le tableau (pas un-liner).

var arr = [];
_.forOwn(obj,function(item, key) {
    arr.Push({ property : key, value : item});
});
1
sambomartin