我有一个users对象,试图在其上使用lodash map()方法,使其仅返回userIds ,同时使用过滤掉所有用户currentUserId。我想避免使用chain()它,因为它引入了整个库,因此该flow()方法似乎很完美,但它并未映射到ID数组。
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);
Run Code Online (Sandbox Code Playgroud)
不幸的是,这返回的对象与传递给它的对象相同。如何获得一个不是当前用户的所有用户ID的数组?
答案适用于lodash的标准版本。请参阅@Vlaz的答案以了解lodash的功能编程版本。
在编写时,_.map(user => user.uid)它实际上是在那个时候调用该函数。您真正想做的是创建类似于的函数_.map,但已经设置了其中一个参数。
幸运的是,Lodash具有内置功能来处理这种情况- _.partialRight
const userIds = _.flow(
_.partialRight(_.map, user => user.uid)
_.partialRight(_.filter, userId => userId !== currentUserId),
)(users);
Run Code Online (Sandbox Code Playgroud)
另外,如果您希望使用纯JS而不是导入新函数,则可以将其包装在匿名函数中以正确传递参数。
const userIds = _.flow(
(users) => _.map(users, user => user.uid),
(users) => _.filter(users, userId => userId !== currentUserId),
)(users);
Run Code Online (Sandbox Code Playgroud)
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);Run Code Online (Sandbox Code Playgroud)
<script src="https://cdn.jsdelivr.net/lodash/4/lodash.min.js"></script>Run Code Online (Sandbox Code Playgroud)
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);Run Code Online (Sandbox Code Playgroud)
<script src="https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)"></script>Run Code Online (Sandbox Code Playgroud)
根据 Lodash FP 指南,您应该将其导入到您的文件中
// Load the fp build.
var fp = require('lodash/fp');
Run Code Online (Sandbox Code Playgroud)
在您的情况下,您可以只导入map, filter, 并且flow您应该获得他们的 lodash FP 变体。
| 归档时间: |
|
| 查看次数: |
2086 次 |
| 最近记录: |