You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Lodash函数式编程:如何在_.flow中对_.orderBy进行部分应用以简化代码

解决方法:用Lodash的_.partialRight进行部分应用

你想要的写法之所以没法直接生效,是因为_.orderBy的参数顺序是(collection, [iteratees], [orders])——如果直接写_.orderBy([r], [o]),相当于你已经把[r]当作第一个参数(要排序的集合)调用了_.orderBy,而不是返回一个等待集合参数的函数。这时候flow会把_.cloneDeep的结果传给这个调用的返回值(已经排序好的[r]数组),完全不符合预期。

不过用Lodash自带的_.partialRight就能完美解决这个问题,它可以固定函数的最后几个参数,返回一个等待剩余参数的新函数。修改后的代码如下:

const x = (r, f, o) => _.flow([_.cloneDeep, _.partialRight(_.orderBy, [r], [o])])(r);

原理说明

_.partialRight(_.orderBy, [r], [o])会返回一个新函数,这个函数的逻辑等价于你原来的箭头函数x => _.orderBy(x, [r], [o]):当flow把_.cloneDeep的结果传给这个新函数时,它会自动把这个结果作为第一个参数传入_.orderBy,再加上你固定的[r]和[o],最终执行_.orderBy(clonedR, [r], [o]),和原来的代码效果完全一致。

替代方案:用_.curry

如果你更喜欢用柯里化的方式,也可以用_.curry搭配占位符实现:

const x = (r, f, o) => _.flow([_.cloneDeep, _.curry(_.orderBy)(_, [r], [o])])(r);

这里_.curry(_.orderBy)会把_.orderBy转成柯里化函数,_是Lodash的占位符,表示这个位置的参数留到后面再传入,这样就实现了固定后两个参数、等待第一个集合参数的效果。

内容的提问来源于stack exchange,提问作者Radex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 15:04:08