web-dev-qa-db-fra.com

Comment enchaînez-vous les fonctions avec lodash?

J'ai un objet qui ressemble à

var foundUser = {
    charData: []
}

qui puis je charge un objet à partir d'une base de données en utilisant mysql puis j'appelle

_.assignIn(foundUser, rows[0]);

Mais je reçois quelques propriétés supplémentaires dont je n’ai pas besoin (cela ne peut pas être résolu en utilisant select)

Alors j'appelle

foundUser = _.omit(foundUser, ['blah']);

Mais ce serait bien si je pouvais juste faire

_.assignIn(foundUser, rows[0]).omit(rows[0], ['blah']);

Mais cela jette une erreur, est-ce que je me trompe ou existe-t-il un autre moyen de le faire?

42
Datsik

Pour chaîner avec lodash, vous devez d’abord envelopper l’objet:

_(foundUser).assignIn(rows[0]).omit(['blah']).value();

Plus de précisions:

Le _ Crée un objet lodash qui permet le chaînage implicite de méthodes. Le chaînage de méthode implicite signifie que dans certaines circonstances, il peut renvoyer une valeur primitive, dans d'autres, il peut renvoyer un objet lodash que vous devez décompresser en appelant .value().

Si vous utilisiez _.chain(...), vous créeriez un objet lodash avec un chaînage de méthode explicite. Le résultat est toujours une valeur encapsulée et doit toujours être décompressé en appelant .value().

Pour plus de références, voici les liens vers la documentation:

Chaînage explicite à Lodash

chaînage implicite dans Lodash

68
Kenneth

En guise d'alternative au modèle wrap-chain-undrap (rien de fondamentalement faux, mais les alternatives sont toujours intéressantes), il existe un autre moyen de vérifier.

Essayez en utilisant _.flow .

L'idée est que chaque fonction dans flow recevra en entrée la sortie de la précédente, qui correspond exactement à ce dont vous avez besoin. Un exemple, à partir de ces données:

var foundUser = {
    charData: []
};

var rows = [{ok: 1, blah: 'nope'}];

En utilisant Lodash FP nous pouvons passer les données en dernier argument. Cette fonctionnalité, associée au currying automatique de chaque méthode dans Lodash/fp, nous facilite la vie lorsque nous composons des fonctions. Cela signifie que nous pouvons avoir ce code succinct et expressif:

_.flow(
 _.assign(rows[0]),
 _.omit('blah')
)(foundUser);

// >> {"charData":[],"ok": 1}

En utilisant la version standard de Lodash, nous devons vérifier ces fonctions nous-mêmes en utilisant _.partial, et le code semblera certainement moins concis, mais il est toujours possible de le faire:

_.flow(
 _.partialRight(_.assign, rows[0]),
 _.partialRight(_.omit, 'blah')
)(foundUser);

// >> {"charData":[],"ok": 1}

L’utilisation de flow plutôt que l’enchaînement présente un grand avantage: vous pouvez facilement mélanger les méthodes Lodash avec vos propres fonctions personnalisées, comme ils l'ont dit, tout ce dont ils ont besoin, ce sont des données en entrée et des données en sortie, et rien d'autre:

const yourFunction = d => ({ ...d, yourProp: 4 });

_.flow(
 _.assign(rows[0]),
 yourFunction,
 _.omit('blah')
)(foundUser);

// >> {"charData":[],"ok": 1, yourProp: 4}

Cela rend la composition de fonctions beaucoup plus facile et plus flexible et conduira naturellement à un code plus expressif.

Une autre chose à noter. Si vous installez et importez uniquement les méthodes Lodash que vous utilisez, vous devrez ajouter uniquement le package flow et non toute la bibliothèque Lodash comme vous le feriez avec le chaînage.

npm i --save lodash.flow

Contre

npm i --save lodash

Peut-être un avantage négligeable dans de nombreuses applications du monde réel où avoir la version complète de Lodash n’est pas un problème et peut-être plus facile à maintenir à jour, mais très pratique si vous écrivez une bibliothèque ou un script qui sera distribué pour être utilisé comme un outil tiers. Dans ce cas, vous serez en mesure de réduire considérablement votre empreinte en termes de taille distribuée.

Méthodes Lodash:

Deux articles à découvrir:

NB - le titre du deuxième article est un peu dur à mon avis, mais ne le sautez pas, le contenu est en effet très instructif.

Quelques autres choses à noter:

  • Dans Lodash/fp, Flow est associé à _.pipe, vous pouvez donc choisir celui que vous préférez.

  • Vous pouvez aussi utiliser _.flowRight (ou son fp alias _.compose) si vous préférez la composition droite à gauche, comme indiqué dans composition de Ramda .

Exemple:

_.flow(
 _.assign(rows[0]), // #1st to execute
 yourFunction,  // #2
 _.omit('blah'),  // #3
)(foundUser);

// is the same as...

_.flowRight(
 _.omit('blah'), // #3rd to execute
 yourFunction, // #2
 _.assign(rows[0]), // #1
)(foundUser);
23
Nobita

Avez-vous déjà essayé lodash/fp ? Il vient avec toutes les mêmes fonctions, mais elles sont au curry et aucune d’entre elles ne modifie l’entrée.

Grâce à cela, vous pouvez les composer de manière vraiment sympa.

Exemple:

import moment from 'moment'
import { compose, filter, groupBy, size, sortBy } from 'lodash/fp'

const fromAdmin = filter({ type: 'admin' })
const groupedByDate = groupBy(message => moment(message.createdAt).format('YYYYMMDD'))
const sorted = sortBy('createdAt')
const unreadByUser = filter({ isReadByUser: false })

const groupedMessages = compose(
  groupedByDate,
  sorted,
  unreadByUser,
  fromAdmin,
)(messages)
5
Daniel