【问题标题】:Better and more performant than lodash chain比 lodash 链更好,性能更高
【发布时间】:2018-04-12 14:20:42
【问题描述】:

我在一些论坛上读到,应该尽可能避免使用 lodash 链,以获得更好的性能和代码的可读性。那么有没有办法在集合上使用原生 javascript 函数来替换这段代码。

_(userCollection).chain()
        .map('name')
        .compact()
        .uniq()
        .value();

类似下面这样的东西,但我不确定这样写是否有任何附加价值

_.uniq(_.compact(userCollection.map('name')))

【问题讨论】:

  • Izaak Schroeder's article 提出这一点是一本好书。简短的回答是切换到 lodash/fp,并使用 flow/flowRight 之类的结构而不是链。
  • 这是一篇精彩的文章,但我不清楚 OP 的声明“我在一些论坛上读到,为了更好的性能和代码的可读性,应尽可能避免使用 lodash 链。”它与那篇文章有关。这篇文章讨论了“如何获得 2 倍的构建时性能提升和 1.5 倍的包大小减少”,这不是“运行时性能提升”。本文还讨论了.chain 为何/如何提高可读性,这就是人们使用它的原因。
  • @gforce301:这篇文章的重点是展示chain 的问题,并推广一种至少可读性更高的替代方案:flow。这与 Ramda(我是其中的作者)提倡的风格相同,并且在函数式语言中很常见。

标签: javascript ecmascript-6 lodash


【解决方案1】:

您可以使用_.flow() 运行一系列方法:

const { flow, partialRight: pr, map, compact, uniq } = _;

const getUniqeNames = flow(
  pr(map, 'name'),
  compact,
  uniq
);

const arr = [{ name: 'John' }, {}, { name: 'Smith' }, {}, { name: 'John' }, { name: 'Smith' }] 

const result = getUniqeNames(arr);

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>

Flow 与lodash/fp 配合得更好,因为这些方法是迭代优先和数据最后的。这省去了对每个需要参数的方法进行部分正确的需要(在 lodash 示例中为pr(map, 'name'))。

const { flow, map, compact, uniq } = _;

const getUniqeNames = flow(
  map('name'),
  compact,
  uniq
);

const arr = [{ name: 'John' }, {}, { name: 'Smith' }, {}, { name: 'John' }, { name: 'Smith' }] 

const result = getUniqeNames(arr);

console.log(result);
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>

【讨论】:

    【解决方案2】:

    我相信这就是您正在寻找的。不需要 lodash。

    lodash.map可以改为Array.prototype.map

    lodash.compact可以改成Array.prototype.filter

    lodash.uniq 可以更改为 Set 构造函数,并且可以选择再次转换为数组。

    const users = [
      {name: 'Me'},
      {name: 'Someone Else'},
      {name: 'Someone Else'},
      {name: ''},
    ];
    
    const uniqueNames = Array.from(new Set(users
      .map(user => user.name)
      .filter(name => name)));
    
    console.log(uniqueNames);

    【讨论】:

    • .filter(Boolean) 可能比 .filter(name => name) 干净。
    • 答案可以为完整性提供基准,因为问题涉及性能。一般来说,我希望 Lodash 性能更好。
    • 我不清楚问题是关于特定代码还是技术。这对于特定代码来说很好,但是有很多 lodash 函数没有简单的本地对应物。
    • @estus:出于性能原因,我看到的大多数反对chain 的内容都是关于包大小,而不是执行速度。
    • @ScottSauyet 这是一个带有示例代码的一般问题。但我相信,谈论性能,它只对前端有意义,对于后端来说,一切都是构建的
    猜你喜欢
    • 2013-12-29
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 2018-04-11
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多