Existe-t-il une fonction lodash intégrée pour prendre ceci:
var params = [
{ name: 'foo', input: 'bar' },
{ name: 'baz', input: 'zle' }
];
Et sortez ceci:
var output = {
foo: 'bar',
baz: 'zle'
};
En ce moment, j'utilise juste Array.prototype.reduce()
:
function toHash(array, keyName, valueName) {
return array.reduce(function(dictionary, next) {
dictionary[next[keyName]] = next[valueName];
return dictionary;
}, {});
}
toHash(params, 'name', 'input');
Vous vous demandez s'il existe un raccourci lodash.
javascript
lodash
coeur
la source
la source
_.keyBy
transformera le tableau entier en objet, alors que la question est principalement d'avoir un élément de chaque objet dans le tableau comme clé et un autre élément comme valeur. Si_.keyBy
est utilisé, toutes les valeurs seront des objets.Vous devriez utiliser _.keyBy pour convertir facilement un tableau en objet.
Docs ici
Exemple d'utilisation ci-dessous:
var params = [ { name: 'foo', input: 'bar' }, { name: 'baz', input: 'zle' } ]; console.log(_.keyBy(params, 'name'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
Si nécessaire, vous pouvez manipuler le tableau avant d'utiliser _.keyBy ou l'objet après avoir utilisé _.keyBy pour obtenir le résultat exact souhaité.
la source
Oui, c'est ici , en utilisant
_.reduce
var params = [ { name: 'foo', input: 'bar' }, { name: 'baz', input: 'zle' } ]; _.reduce(params , function(obj,param) { obj[param.name] = param.input return obj; }, {});
la source
reduce()
précipite avec un autre cas d'utilisation. Façon intelligente de le faire!_.reduce
moins que cela n'exprime avec précision ce que vous essayez de faire: cela obscurcit considérablement le point du code dans tous les autres cas._.zipObject
Personnellement, je préfère la solution de @djechlin - à défaut, l' approche_.keyBy
/_.mapValues
.Cela semble être un travail pour Object.assign:
const output = Object.assign({}, ...params.map(p => ({[p.name]: p.input})));
Édité pour envelopper comme une fonction similaire à OP, ce serait:
const toHash = (array, keyName, valueName) => Object.assign({}, ...array.map(o => ({[o[keyName]]: o[valueName]})));
(Merci à Ben Steward, bonne réflexion ...)
la source
Vous pouvez utiliser un javascript de ligne avec la méthode de réduction de tableau et la déstructuration ES6 pour convertir un tableau de paires clé / valeur en objet.
arr.reduce((map, { name, input }) => ({ ...map, [name]: input }), {});
la source
C'est probablement plus verbeux que vous ne le souhaitez, mais vous demandez une opération légèrement complexe afin que le code réel puisse être impliqué (l'horreur).
Ma recommandation, avec
zipObject
c'est assez logique:_.zipObject(_.map(params, 'name'), _.map(params, 'input'));
Une autre option, plus hacky, utilisant
fromPairs
:_.fromPairs(_.map(params, function(val) { return [val['name'], val['input']));
La fonction anonyme montre le piratage - je ne crois pas que JS garantit l'ordre des éléments dans l'itération des objets, donc l'appel
.values()
ne fera pas l'affaire.la source
fromPairs
, et les appels nevalues()
suffiront pas. Au moins du point de vue de la lisibilité.Une autre façon avec lodash
créer des paires, puis soit construire un objet, soit
ES6 Map
facilement_(params).map(v=>[v.name, v.input]).fromPairs().value()
ou
_.fromPairs(params.map(v=>[v.name, v.input]))
Voici un exemple de travail
Afficher l'extrait de code
var params = [ { name: 'foo', input: 'bar' }, { name: 'baz', input: 'zle' } ]; var obj = _(params).map(v=>[v.name, v.input]).fromPairs().value(); console.log(obj);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>
la source
Object.fromEntries(params.map(v => [v.name, v.input]))
Il peut également résoudre sans utiliser aucune fonction lodash comme celle-ci:
let paramsVal = [ { name: 'foo', input: 'bar' }, { name: 'baz', input: 'zle' } ]; let output = {}; paramsVal.forEach(({name, input})=>{ output[name] = input; }) console.log(output);
la source