lodash中的reduce后继续链式调用

3

我想要实现的功能如下:

_(data)
  .map(() => /** ... */)
  .reduce(function (modifier, doc) {
    modifier.$set = modifier.$set || {};
    modifier.$set.names = doc.names;
    return modifier;
  }, {})
  .map(() => /** ... */)
  .flatten()

然而,在使用reduce后,链条似乎被打断了。

有没有办法从reduce返回的值继续链式操作呢?


那么 reduce 返回什么?我们无法重现您的问题。提供一个能够复制该问题的演示将有所帮助。 - charlietfl
类似于 { $set: { names: [ 'alex', 'jeff' ] } } 的东西。 - corvid
是的,那只是一个例子。我的意思是我想继续使用这个对象作为链条。 - corvid
开始一个新的链,reduce返回自己的非数组内容,无法链接... - dandavis
2个回答

7

reduce() 方法不能保证返回一个集合(数组、对象或字符串),因此默认情况下它无法被链式调用。

根据 lodash 对象 (_) 的文档:

操作并返回数组、集合和函数的方法可以链接在一起。检索单个值或可能返回原始值的方法将自动结束链式调用,返回未包装的值。

_ 文档

但是你可以使用 _.chain() 显式地强制进行链式调用。这将允许单个值和原始类型在 lodash 包装器内明确返回以进行继续链接。

因此,对于您的代码,可能如下:

_.chain(data)
  .map(() => /** ... */)
  .reduce(function (modifier, doc) {
    modifier.$set = modifier.$set || {};
    modifier.$set.names = doc.names;
    return modifier;
  }, {})
  .map(() => /** ... */)
  .flatten()

_.chain() documentation


啊,好的,那就有意义了,为什么他们不允许它链式调用。 - corvid
@corvid 我更新了我的答案,并提供了一些关于 _.chain() 的信息,这可能有助于你的使用情况。 - Mike Brant
我接受了这个答案,我不知道隐式链和显式链是有区别的。 - corvid

2
lodash文档中指出,reduce()方法默认不支持链式调用。具体请参见以下链接: "The wrapper methods that are not chainable by default are: ... reduce" https://lodash.com/docs#_

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接