Existe-t-il une fonction lodash intégrée pour prendre ceci:
var params = [
{ name: 'foo', input: 'bar' },
{ name: 'baz', input: 'zle' }
];
Et sortie ceci:
var output = {
foo: 'bar',
baz: 'zle'
};
En ce moment, j'utilise seulement 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 y a un raccourci de lodash.
autrement - lodash 4.17.2
_.chain(params)
.keyBy('name')
.mapValues('input')
.value();
ou
_.mapValues(_.keyBy(params, 'name'), 'input')
ou avec _.reduce
_.reduce(
params,
(acc, { name, input }) => ({ ...acc, [name]: input }),
{}
)
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;
}, {});
Vous devriez utiliser _.keyBy pour convertir facilement un tableau en objet.
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é.
Vous pouvez utiliser le javascript de ligne de texte avec array array method et ES6 destructuring pour convertir un tableau de paires clé-valeur en objet.
arr.reduce((map, { name, input }) => ({ ...map, [name]: input }), {});
Ceci est probablement plus détaillé que vous ne le souhaitez, mais vous demandez une opération légèrement complexe pour que le code réel soit impliqué (l'horreur).
Ma recommandation, avec zipObject
c'est assez logique:
_.zipObject(_.map(params, 'name'), _.map(params, 'input'));
Une autre option, plus compliquée, utilisant fromPairs
:
_.fromPairs(_.map(params, function(val) { return [val['name'], val['input']));
La fonction anonyme montre le piratage - je ne crois pas que JS garantisse l'ordre des éléments dans l'itération d'objet, donc l'appel .values()
ne le fera pas.
Cela ressemble à un travail pour Object.assign:
const output = Object.assign({}, ...params.map(p => ({[p.name]: p.input})));
Edité pour envelopper comme une fonction similaire à celle des OP, ce serait:
const toHash = (array, keyName, valueName) =>
Object.assign({}, ...array.map(o => ({[o[keyName]]: o[valueName]})));
(Merci à Ben Steward, bonne pensée ...)