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?
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?
Share Improve this question edited Dec 20, 2022 at 19:12 dapperdandev 3,2983 gold badges18 silver badges29 bronze badges asked Sep 12, 2018 at 14:25 zeckdudezeckdude 16.2k44 gold badges146 silver badges194 bronze badges 9 | Show 4 more comments3 Answers
Reset to default 9The 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);
It appears that you are not using the functional version of lodash.
var users = {
123: {
uid: 123
},
456: {
uid: 456
}
};
var currentUserId = 123;
const userIds = _.flow(
_.map(user => user.uid),
_.filter(userId => userId !== currentUserId)
)(users);
console.log("result with normal lodash", userIds);
<script src="https://cdn.jsdelivr.net/lodash/4/lodash.min.js"></script>
var users = {
123: {
uid: 123
},
456: {
uid: 456
}
};
var currentUserId = 123;
const userIds = _.flow(
_.map(user => user.uid),
_.filter(userId => userId !== currentUserId)
)(users);
console.log("result with lodash FP", userIds);
<script src="https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)"></script>
As per the Lodash FP guide, you should be importing that into your files
// Load the fp build.
var fp = require('lodash/fp');
In your case, you can just import just map
, filter
, and flow
but you should get their lodash FP variants.
Can do this with a simple native JS reduce of array created by Object#values()
with no more code than using lodash
const users = {123: {uid: 123},456: {uid: 456}};
const currId = 123;
const userIds = Object.values(users)
.reduce((a, {uid}) => uid !== currId ? a.concat(uid): a, [])
console.log(userIds)
<script src="https://cdn.jsdelivr.net/npm/[email protected]/lodash.min.js"></script>
_.map(user => user.uid)
is evaluated before_.flow()
is even called. – Pointy Commented Sep 12, 2018 at 14:27_.map
be the curried invocation that creates a new function that expects an object to execute the mapping against? Unless OP is not using the lodash in its functional form, then the_.map
shouldn't executing right after – VLAZ Commented Sep 12, 2018 at 14:32_.flow()
method expects to be passed an array of function references. That's not what's being done in the posted code. – Pointy Commented Sep 12, 2018 at 14:33_.map(user => user.uid)
is a function call, not a function. – Pointy Commented Sep 12, 2018 at 14:35