lodash 函数式编程如何在流中进行部分应用

lodash funcional programming how to do partial application in _flow

我正在使用最新的 lodash,下面的代码有效,但我想删除 x => 部分,现在我被迫使用,因为我不能使用 _.orderBy[ 的部分应用程序=13=]

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

你知道如何更改代码吗

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

您可以使用 _.rearg()_.curry() 来获得一个接受数据 (x) 作为最后一个参数的新函数,并且 returns 一个新函数,如果它收到少于 3 个参数:

const orderByCurried = _.curry(_.rearg(_.orderBy, [2, 0, 1]), 3);

const fn = (r, f, o) => orderByCurried([f], [o])(r);

它不比箭头函数短x =>,但是如果你经常使用它...

注意_.orderBy()不影响原始数组,所以不需要先克隆它。

示例(改编自 VLAZ 的 ):

const orderByCurried = _.curry(_.rearg(_.orderBy, [2, 0, 1]), 3);

const fn = (r, f, o) => orderByCurried([f], [o])(r);

const users = [
  { 'user': 'fred',   'age': 48 },
  { 'user': 'barney', 'age': 34 },
  { 'user': 'fred',   'age': 40 },
  { 'user': 'barney', 'age': 36 }
];

const sorted = fn(users, 'age', 'asc');

console.log(sorted);
console.log(users);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js" integrity="sha512-WFN04846sdKMIP5LKNphMaWzU7YpMyCU245etK3g/2ARYbPK9Ub18eG+ljU96qKRCWh+quCY7yefSmlkQw1ANQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>

另一种选择是切换到 lodash/fp,它具有所有参数顺序正确的函数,并且所有函数都是柯里化的。

完成此任务的最简单方法是使用 Lodash FP Lodash 的函数式编程友好构建。它公开了相同的函数,但它重新排列参数以将数据移到最后,然后自动柯里化它们。它更方便,因为它简化了许多函数式编程任务,并且您不需要更改代码(除了使用正确的构建之外):

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

const users = [
  { 'user': 'fred',   'age': 48 },
  { 'user': 'barney', 'age': 34 },
  { 'user': 'fred',   'age': 40 },
  { 'user': 'barney', 'age': 36 }
];

console.log(x(users, 'age', 'asc'));
console.log(users); //unchanged
<script src="https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)"></script>

如果您在模块环境中,您可以轻松地选择要使用的导入:

import flow from 'lodash/flow';
import cloneDeep from 'lodash/cloneDeep';
// or
import { flow, cloneDeep } from 'lodash';

import orderBy from 'lodash/fp/orderBy';
// or
import { orderBy } from 'lodash/fp';

但是如果您只有常规的 Lodash 构建,那么您可以使用 进行与 Lodash FP 相同的修改。