mfrachet
mfrachet

Reputation: 8922

lodash fp and refactoring some existing code

I'm learning functional programming and I'm trying to refactor a piece of old code using lodash FP.

Here's the code I have:

_.filter(x => isIdInArray(x)(xs))(otherXs)

It's too complicated to read and makes me feel a bit weird (smell ?)

My problem is that x value, that is the first argument of isIdInArray is declared this way:

const getId = _.get('id');
const isIdInArray = _.compose(_.includes, getId);

I can't use my lodash filter function this way:

_.filter(isIdInArray(xs))(otherXs)

I don't even know if it's feasible, but I'm pretty sure I can do something clearer or more readable.

Do you have some ideas ?

Upvotes: 0

Views: 174

Answers (2)

Hugo Wood
Hugo Wood

Reputation: 2260

If you're writing production code, I recommend using a higher-level function. In your particular case I'd say you need _.intersectionBy:

const keepIfIdInArray = _.intersectionBy('id'); // 'id' can be replaced by your getId
const keepIfIdInOtherXs = keepIfIdInArray(otherXs);
keepIfIdInOtherXs(xs);

If you're doing this as an exercice, then I'd say you may need to decompose a little more. Notice that in lodash/fp, _.includes is curried so you should be able to write the following:

const getId = _.get('id');
const isIdInArray = arr => _.compose(_.includes(arr), getId);
const isIdInOtherXs = isIdInArray(otherXs);
_.filter(isIdInOtherXs)(xs);

Upvotes: 2

S.Loyft
S.Loyft

Reputation: 66

Try not to stuff all the fancy features that lodash gives you into a single line there. Having a complex mechanism in one line may seem nice, but if you can't read it anymore its not very helpful at all.

For managing collections i usually use approaches like this:

var collection = [{id: 'a', someField: 1}, {id:'b', someField: 2}];
var theIdsYoureLookingFor = ['a'];

var filtered = collection
                .filter(anyObject => _.includes(theIdsYoureLookingFor, anyObject.id))
                .map(anyObject => anyObject.someField);

alert(filtered); // alerts 1

Which parses a collection of objects, filters for those who have an id that you consider valid and then maps those objects to a certain field.

Also don't ever use variable names like: x, xs

Upvotes: 3

Related Questions