web-dev-qa-db-fra.com

lodash: tableau de correspondance en objet

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.

39
core

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 }),
    {}
)
52
stasovlas

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;
}, {});
24
JagsSparrow

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é.

15
danday74

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 }), {});
10
Faisal Hasnain

Il peut aussi résoudre sans utiliser une 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);

 enter image description here

3

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.

2
djechlin

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 ...)

2
RainedColony