【问题标题】:How to chain lodash function calls properly如何正确链接 lodash 函数调用
【发布时间】:2018-10-13 03:57:54
【问题描述】:

我需要对一组对象进行排序,然后从中取出第一项。如何在 lodash 中实现这一点?

_.sortBy(window.locations, [{ 'is_primary': 'desc' }])

这给了我一个正确的排序数组。如何使用_.first() 函数从中获取第一个元素?可能把它们锁起来?

【问题讨论】:

    标签: javascript sorting lodash


    【解决方案1】:

    你可以使用_.chain然后解包值:

    https://lodash.com/docs/4.17.10#chain

    另一种方法是将结果包装在 _.first 中,因为 lodash 受到保护,不受 undefined、空数组、null 等的影响(可能发生的最坏情况是返回空数组):

    _.first(_.sortBy(window.locations, [{ 'is_primary': 'desc' }]));
    

    关于浏览器环境中 _.chain 的旁注 - 它可能会导致您的捆绑软件显着增长(因为它可能会在您的捆绑软件中包含许多 lodash 函数),如果您担心这一点,请阅读这篇文章:

    https://medium.com/making-internets/why-using-chain-is-a-mistake-9bc1f80d51ba

    TL;DR 如果您正在执行简单的操作并关心输出 JS 包的大小,请坚持使用 _.first 进行包装:)

    【讨论】:

    • stick to just wrapping in _.first 如果您使用_.flow 将函数组合在一起,则更易于阅读。使用 Lodash/FP _.flow(_.first, _.sortBy([{ 'is_primary': 'desc' }]) 会给你一个函数,然后用你的数据调用。
    • 太棒了。为我工作,谢谢
    【解决方案2】:

    首先让我们注意 _.first is a alias of _.head 只是为了让您知道并且不要混淆为什么他们都做同样的事情。

    另外,_.sortBy_.orderBy 之间也存在差异,这总是会出现,也应该注意:

    _.sortBy 允许您按 lodash short 符号或通过函数排序,但只能按升序

    _.orderBy 的作用相同,但允许您指定多个字段以及它们的排序顺序 (asc/desc)

    考虑以下示例:

    var users = [
      { 'user': 'fred',   'age': 1, 'drinks': 1 },
      { 'user': 'barney', 'age': 4, 'drinks': 3 },
      { 'user': 'brat',   'age': 4, 'drinks': 6 },
      { 'user': 'josh',   'age': 2, 'drinks': 2 },
      { 'user': 'jim',    'age': 2, 'drinks': 10 },
      { 'user': 'barney', 'age': 3, 'drinks': 5}
    ];
    
    const sortBy = _.sortBy(users, ['age','drinks'])
    const orderBy = _.orderBy(users, ['age', 'drinks'], ['asc', 'desc'])
    
    console.log('sortBy', sortBy)
    console.log('orderBy', orderBy)
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

    从输出中可以看出(当用户年龄相同时),在对多个字段进行排序时,orderBy 的优势在于其便利性。

    回到你的问题:

    您可以使用以下任何一种:

    // ONLY ASC
    _.head(_.sortBy(window.locations, ['is_primary']));
    _.first(_.sortBy(window.locations, ['is_primary']));
    
    // ASC & DESC
    _.head(_.orderBy(window.locations, ['is_primary'], ['desc']));
    _.first(_.orderBy(window.locations, ['is_primary'], ['desc']));
    

    最后一个chaining 主要是为了方便和可读性。如果您有超过 2 个操作,则阅读起来会很棘手,因此规则通常是如果超过 2 个则链接,但如果等于或小于则不链接。

    大多数使用链接的示例都应用于两个以上的操作。

    还指出只是为了链接,您需要来自 lodash 的额外代码,这可能是您不想要的。

    【讨论】:

      猜你喜欢
      • 2016-06-06
      • 2017-08-26
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-27
      相关资源
      最近更新 更多