使用lodash,为什么流程中的map方法不起作用?

zec*_*ude 5 javascript lodash

我有一个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的数组?

Vla*_*274 5

答案适用于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)


VLA*_*LAZ 5

看来您没有使用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);
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 变体。