一个简单的例子:
const strings = ['dog', 'cat', 'elephant'];
const stringLengths = strings.map((s) => s.length)
我想写的是:
const strings = ['dog', 'cat', 'elephant'];
const stringLengths = strings.map(_.length)
(Scala支持这样的结构)
我想知道是否有人实现了这样的东西?我尝试了代理类的一种方法,我可能会让它工作,但我不能让它接近类型安全。
Lodash允许直接指定属性以方便_.map(strings, "length")
const strings = ['dog', 'cat', 'elephant'];
const result = _.map(strings, "length");
console.log( result );
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>
该字符串是_.property()
的简写,也可以单独用于常规的.map()
调用:
const strings = ['dog', 'cat', 'elephant'];
const result = strings.map(_.property("length"));
console.log( result );
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>
对于调用方法,而不仅仅是提取属性,使用_method()
:
const strings = ['dog', 'cat', 'elephant'];
//without arguments
const shout = _.method("toUpperCase");
//with arguments
const shorten = _.method("slice", 1, 7);
console.log( strings.map(shout) );
console.log( strings.map(shorten) );
.as-console-wrapper { max-height: 100% !important}
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>
请参阅Lodash FP,它是Lodash的一个更函数式编程友好的版本,其中所有函数都是自动curry的,并将数据放在最后,以更容易地实现组合和重用:
const extractLength = _.map("length");
const strings = ['dog', 'cat', 'elephant'];
console.log( extractLength(strings) );
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash-fp/0.10.4/lodash-fp.min.js"></script>
要在TypeScript中使用Lodash,请安装DefinitelyTyped项目中的类型:
npm install --save-dev @types/lodash
Ramda
Ramda与Lodash具有相同的优势,因为它提供了通用实用程序。它更倾向于函数式编程,所有的实用程序都已经实现了柯里化,并支持函数结构,如Functors。
Ramda有几种方法来处理这些。
使用R.prop()
const strings = ['dog', 'cat', 'elephant'];
const result = strings.map(R.prop("length"));
console.log( result );
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.29.0/ramda.min.js"></script>
使用透镜-透镜是可组合的getter和setter。在这个简单的例子中,R.prop()
更方便,但对于更复杂的结构和查看内容的规则,镜头可能更合适。用法如下:
const strings = ['dog', 'cat', 'elephant'];
const result = strings.map(R.view(R.lensProp("length")));
console.log( result );
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.29.0/ramda.min.js"></script>
对于调用方法,Ramda提供了一个与Lodash的_.method()
直接比较的R.invoker()
:
const strings = ['dog', 'cat', 'elephant'];
//without arguments
const shout = R.invoker(0, "toUpperCase");
//with arguments
const shorten = R.invoker(2, "slice")(1, 7);
console.log( strings.map(shout) );
console.log( strings.map(shorten) );
.as-console-wrapper { max-height: 100% !important}
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.29.0/ramda.min.js"></script>
与Lodash类似,要在TypeScript中使用Ramda,请安装DefinitelyTyped项目中的类型
npm install --save-dev @types/ramda