Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using lodash, why is the map method within flow not working?

I have a users object am trying to use the lodash map() method on it to have it return only the userIds, while filtering out any users with the currentUserId. I wanted to avoid using chain() since it pulls in the entire library, so it seemed that the flow() method is perfect, yet it's not mapping to an array of Id's.

import {
  map, filter, flow,
} from 'lodash';

const users = {
    123: {
      uid: 123
    },
    456: {
      uid: 456
    }
};

const currentUserId = 123;

const userIds = _.flow(
  _.map(user => user.uid),
  _.filter(userId => userId !== currentUserId),
)(users);

Unfortunately, this is returning the same object as was passed into it. How can I get an array with the ids of all the users that are not the current user?

like image 884
zeckdude Avatar asked Sep 12 '18 14:09

zeckdude


People also ask

Does lodash work with maps?

Lodash helps in working with arrays, collection, strings, objects, numbers etc. The _. map() method creates an array of values by running each element in collection through the iteratee. There are many lodash methods that are guarded to work as iteratees for methods like _.

Do people still use lodash?

Lodash and Underscore are great modern JavaScript utility libraries, and they are widely used by Front-end developers.

How does lodash filter work?

Syntax. Iterates over elements of collection, returning an array of all elements predicate returns truthy for. The predicate is invoked with three arguments: (value, index|key, collection).

How does lodash find work?

Using Lodash's find() Function Lodash's find() function returns the first element of a collection that matches the given predicate . find() is different from Lodash's filter() function because filter() returns all elements that match a condition, whereas find() returns the first element that matches a condition.


1 Answers

The answer applies for the standard version of lodash. Please see @Vlaz's answer for a look at the functional programming version of lodash.


When you write _.map(user => user.uid) it is actually invoking the function at that time. What you're really attempting to do is to create function that is similar to _.map, but has one of its arguments already set.

Fortunately, Lodash has a built-in to handle this situation - _.partialRight

const userIds = _.flow(
  _.partialRight(_.map, user => user.uid)
  _.partialRight(_.filter, userId => userId !== currentUserId),
)(users);

Documentation


Alternatively if you wish to use plain JS rather than importing a new function, you can simply wrap it in an anonymous function to pass the arguments properly.

const userIds = _.flow(
  (users) => _.map(users, user => user.uid),
  (users) => _.filter(users, userId => userId !== currentUserId),
)(users);
like image 131
Vlad274 Avatar answered Oct 05 '22 08:10

Vlad274