web-dev-qa-db-fra.com

Javascript undercore array to object

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 }
12
TheBigC
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.

15
thefourtheye

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.

42
kroolk

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);
8
Krasimir

plus simple avec moi: each:

   var t = {};
   _.each(x, function(e){
     t[e.id] = e.votes;
   });
//--> {medium: 7, low: 9, high: 5}
2
nguyên

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
}
1
Oscar Eduardo

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

0
Jo Takion

Utilisez indexBy

_.indexBy([ 
   { id: 'medium', votes: 7 },
   { id: 'low',    votes: 9 },
   { id: 'high',   votes: 5 } 
 ], 'id');
0
udnisap

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);
0
MarkoCen