你如何使用 lodash 链接函数?

新手上路,请多包涵

我有一个看起来像的对象

var foundUser = {
    charData: []
}

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

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

但是我得到了一些我不需要的额外属性(这不能通过使用 select 解决)

所以我打电话

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

但如果我能做到就好了

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

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

原文由 Datsik 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 319
2 个回答

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

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

进一步澄清:

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

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

如需进一步参考,请参阅文档链接:

Lodash 中的显式链接

Lodash 中的隐式链接

原文由 Kenneth 发布,翻译遵循 CC BY-SA 3.0 许可协议

作为 wrap-chain-unwrap 模式的替代方案(它本身没有错,但替代方案总是很有趣)还有另一种方法可以检查。

尝试利用 _.flow

这个想法是内部的每个函数 flow 将接收前一个函数的输出作为输入,这正是你所需要的。一个例子,给定这个数据:

 var foundUser = {
    charData: []
};

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

使用 Lodash FP 我们可以将数据作为最后一个参数传递。这个特性连同 Lodash/fp 中每个方法的自动柯里化让我们在组合函数时更轻松。这意味着我们可以拥有这段简洁而富有表现力的代码:

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

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

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

 _.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 方法,您将只需要添加 flow 包,而不是像链接那样添加整个 Lodash 库。

 npm i --save lodash.flow

npm i --save lodash

在许多现实世界的应用程序中,拥有完整构建的 Lodash 不是问题并且可以说更容易保持最新状态的许多实际应用程序中的优势可能可以忽略不计,但如果您正在编写将分发的库或脚本以用作第三方工具。在这种情况下,您将能够在分布式大小方面保持更低的足迹。

Lodash 方法文档:

值得一看的文章:

其他一些注意事项:

  • 在 Lodash/fp 中,Flow 的别名为 _.pipe ,所以你可以选择任何你喜欢的。

  • 您也可以使用 _.flowRight (或其 fp 别名 _.compose ),如 Ramda 的 compose 所示。

例子:

 _.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);

原文由 Aurelio 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题