Existe-t-il un moyen simple et propre d’utiliser Underscore pour activer cette fonction?
[ { id: 'medium', votes: 7 },
{ id: 'low', votes: 9 },
{ id: 'high', votes: 5 } ]
Dans
{ 'low' : 9,
'medium' : 7,
'high' : 5 }
var data = [ { id: 'medium', votes: 7 },
{ id: 'low', votes: 9 },
{ id: 'high', votes: 5 } ];
Vous pouvez le faire avec _.map
, _.values
et _.object
, comme ceci
console.log(_.object(_.map(data, _.values)));
# { medium: 7, low: 9, high: 5 }
Explication
Nous utilisons la fonction map
pour appliquer la fonction values
(qui obtient toutes les valeurs d'un objet donné) sur tous les éléments de data
, ce qui donnerait
# [ [ 'medium', 7 ], [ 'low', 9 ], [ 'high', 5 ] ]
Ensuite, nous utilisons la fonction object
pour transformer cela en objet.
Vous pourriez envisager _.indexBy (...)
var data = [{
id: 1,
name: 'Jon Doe',
birthdate: '1/1/1991',
height: '5 11'
}, {
id: 2,
name: 'Jane Smith',
birthdate: '1/1/1981',
height: '5 6'
}, {
id: 3,
name: 'Rockin Joe',
birthdate: '4/4/1994',
height: '6 1'
}, {
id: 4,
name: 'Jane Blane',
birthdate: '1/1/1971',
height: '5 9'
}, ];
var transformed = _.indexBy(data, 'id');
Voici un violon: https://jsfiddle.net/4vyLtcrf/3/
Mise à jour: Dans Lodash 4.0.1, la méthode _.indexBy a été renommée en _.keyBy.
Voici avec Vanilla js:
var result = {};
[ { id: 'medium', votes: 7 },
{ id: 'low', votes: 9 },
{ id: 'high', votes: 5 } ].forEach(function(obj) {
result[obj.id] = obj.votes;
});
console.log(result);
plus simple avec moi: each
:
var t = {};
_.each(x, function(e){
t[e.id] = e.votes;
});
//--> {medium: 7, low: 9, high: 5}
La méthode de soulignement la plus puissante est la réduction. Vous pouvez faire presque n'importe quoi avec elle. Et le plus gros avantage est que vous parcourez la collection une seule fois!
var array = [
{ id: 'medium', votes: 7 },
{ id: 'low', votes: 9 },
{ id: 'high', votes: 5 }
];
var object = _.reduce(array, function(_object, item) {
_object[item.id] = item.votes;
return _object;
}, {});
Après son exécution, l'objet sera:
{
medium:7,
low:9,
high:5
}
Vous pouvez le faire avec JS Array.reduce en natif
const myArray = [ { id: 'medium', votes: 7 },
{ id: 'low', votes: 9 },
{ id: 'high', votes: 5 } ]
const myObject = myArray.reduce((obj, item)=>{
o[item.id] = item.votes
return o
}, {})
pour plus de détails, consultez https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
Utilisez indexBy
_.indexBy([
{ id: 'medium', votes: 7 },
{ id: 'low', votes: 9 },
{ id: 'high', votes: 5 }
], 'id');
Je sais que ceci est un ancien post, mais vous pouvez utiliser _.reduce
pour effectuer la transformation de manière propre
var data = [
{ id: 'medium', votes: 7 },
{ id: 'low', votes: 9 },
{ id: 'high', votes: 5 }
]
var output = _.reduce(data, function(memo, entry) {
memo[entry.id] = entry.votes;
return memo;
}, {});
console.log(output);