Javascript-可以改进Ramda.js数据转换吗?
作者:互联网
我有一个商店列表和一个ID列表:
var stores = [{id: '1', name: 'first store'}, {id: '2', name: 'second store'}, {id: '3', name: 'third store'}];
var ids = ['1', '2'];
我想获取与列表中的ID匹配的商店的名称:
["first store", "second store"]
这是我想出的:
var filterStoresById = R.intersectionWith(R.useWith(R.equals, R.view(R.lensProp('id'))));
var extractNames = R.map(R.view(R.lensProp('name')));
extractNames(filterStoresById(stores,ids));
我的目标是学习函数式编程的概念,同时生成可以在现实生活中使用的代码,但我认为我的解决方案既不可读也不高效(我要迭代两次),因此可以对此进行哪些改进码?
解决方法:
您的代码不是可怕的,只是可读性比可能的差一点.
首先,要访问顶级属性,尤其是当您不重用访问方法时,使用prop(name)比view(lensProp(name))要简单得多.拉姆达(Ramda)已选择map(prop).
其次,我发现读取通过函数组成构建的函数比通过嵌套括号嵌套要容易得多.我通常更喜欢用管道组成,但是两者都可以.
所以我会像这样重做您的代码:
var filterStoresById = R.intersectionWith(R.useWith(R.equals, R.prop('id')));
var storeNamesById = R.pipe(filterStoresById, R.pluck('name'));
storeNamesById(stores, ids);
这样做的一个好处是,如果发现您不仅需要名称,还可以使用可重用的filterStoresById函数.
另一个问题是性能.重复两次肯定有罚款.问题是,对于更干净,更容易重构的代码是否值得.有一些技术可以将类似这样的代码转换为功能相同但只迭代一次并避免使用中间容器的代码.您可以查看these articles on transducers了解更多信息.
但是除非您可以向自己证明这实际上是应用程序中的性能问题,否则我不必担心.我以为每个人都知道Knuth的错误说法:“过早的优化是万恶之源”.
标签:ramda-js,javascript,functional-programming 来源: https://codeday.me/bug/20191027/1948022.html