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 相同的修改。
我正在使用最新的 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 构建,那么您可以使用