javascript-如何使用lodash链接函数?

我有一个看起来像的物体

var foundUser = {
    charData: []
}

然后我使用mysql从数据库加载对象,然后调用

_.assignIn(foundUser, rows[0]);

但是我得到了一些我不需要的额外属性(使用select无法解决)

所以我打电话

foundUser = _.omit(foundUser, ['blah']);

但是如果我能做的话那会很好

_.assignIn(foundUser, rows[0]).omit(rows[0], ['blah']);

但这会引发错误,是我做错了还是有其他方法可以做到?

Datsik asked 2020-06-30T00:22:14Z
3个解决方案
71 votes

要与lodash链接,首先必须包装对象:

_(foundUser).assignIn(rows[0]).omit(['blah']).value();

进一步澄清:

_创建一个lodash对象,该对象允许隐式方法链接。 隐式方法链接意味着在某些情况下它可能返回一个原始值,而在其他情况下,它可能会通过调用_.chain(...)返回一个需要拆开的lodash对象。

如果您使用_.chain(...),则将使用显式方法链接创建lodash对象。 结果始终是包装的值,并且始终需要通过对其调用.value()来对其进行包装。

为了进一步参考,这里是文档的链接:

Lodash中的明确链接

Lodash中的隐式链接

Kenneth answered 2020-06-30T00:22:58Z
24 votes

作为包装链解开模式的替代方法(它本质上没有什么错,但是替代方法总是很有趣),您可以使用另一种方法进行检查。

尝试利用_.flowRight

这个想法是_.flowRight内部的每个函数都将接收上一个函数的输入作为输入,而这正是您所需要的。给定一个数据的例子:

var foundUser = {
    charData: []
};

var rows = [{ok: 1, blah: 'nope'}];

使用_.flowRight,我们可以将数据作为最后一个参数传递。 此功能以及Lodash / fp中每个方法的自动执行功能使我们在编写函数时更加轻松。 这意味着我们可以使用以下简洁明了的代码:

_.flow(
 _.assign(rows[0]),
 _.omit('blah')
)(foundUser);

// >> {"charData":[],"ok": 1}

使用Lodash的标准版本,我们必须使用_.flowRight自己处理这些函数,代码看起来当然不会那么简洁,但是仍然可以这样做:

_.flow(
 _.partialRight(_.assign, rows[0]),
 _.partialRight(_.omit, 'blah')
)(foundUser);

// >> {"charData":[],"ok": 1}

使用流而不是链接的一个巨大好处是,您可以轻松地将Lodash方法与您自己的自定义函数混合使用,因为-如前所述- 他们所需要做的只是将数据作为输入,将数据作为输出,仅此而已:

const yourFunction = d => ({ ...d, yourProp: 4 });

_.flow(
 _.assign(rows[0]),
 yourFunction,
 _.omit('blah')
)(foundUser);

// >> {"charData":[],"ok": 1, yourProp: 4}

这使函数的组合变得更加容易和灵活,并且可以说自然会导致更具表现力的代码。

另一件事要注意。 如果仅安装和导入您使用的Lodash方法,则必须添加_.flowRight程序包,而不要像链接那样添加整个Lodash库。

npm i --save lodash.flow

VS

npm i --save lodash

在许多具有Lodash完整版本的现实世界应用程序中,可能没有什么优势,可以说它是一个问题,并且可以说易于维护最新,但是如果您正在编写将分发为 第三方工具。 在这种情况下,就分布尺寸而言,您将能够使足迹减小。

Lodash方法文档:

  • _。流
  • _.partial
  • _.partialRight

有两篇值得一看的文章:

  • 您应该在Javascript中使用的3个lodash函数
  • 为什么链接是一个错误

注意:第二篇文章的标题在我看来有点苛刻,但请不要跳过,其内容确实非常有用。

其他注意事项:

  • 在Lodash / fp中,Flow的别名为_.flowRight,因此您可以选择任意一个。

  • 如果您喜欢从右到左的构图,也可以使用_.flowRight(或其fp别名_.compose),如Ramda的作文所示。

例:

_.flow(
 _.assign(rows[0]), // #1st to execute
 yourFunction,  // #2
 _.omit('blah'),  // #3
)(foundUser);

// is the same as...

_.flowRight(
 _.omit('blah'), // #3rd to execute
 yourFunction, // #2
 _.assign(rows[0]), // #1
)(foundUser);
Nobita answered 2020-06-30T00:24:53Z
5 votes

您是否尝试过lodash / fp? 它具有所有相同的功能,但是它们都是咖喱状的,而且都没有改变输入。

因此,您可以以一种非常不错的方式编写它们。

例:

import moment from 'moment'
import { compose, filter, groupBy, size, sortBy } from 'lodash/fp'

const fromAdmin = filter({ type: 'admin' })
const groupedByDate = groupBy(message => moment(message.createdAt).format('YYYYMMDD'))
const sorted = sortBy('createdAt')
const unreadByUser = filter({ isReadByUser: false })

const groupedMessages = compose(
  groupedByDate,
  sorted,
  unreadByUser,
  fromAdmin,
)(messages)
Daniel answered 2020-06-30T00:25:21Z
translate from https://stackoverflow.com:/questions/35590543/how-do-you-chain-functions-using-lodash