我有一个对象数组
const myNumbers = [
{
top: 10,
bottom: 5,
rate: 5
},
{
top: 9,
bottom: 4,
rate: 3
},
];
在我对数字做任何事情之前,我想运行一些函数使它们变得可用;
const addTen = r.add(10);
const double = r.multiply(2);
和一个接受数字并做一些数学运算的函数:
const process = (top, bottom, rate) => r.multiply(r.subtract(bottom, top), rate)
所以我的最后一个函数看起来像这样
muNymbers.map(({ top, bottom, rate }) =>
process(addTen(top), double(bottom), rate)
);
只要看一下这段代码,你就会发现这两个函数已经变得非常嵌套,而且不是特别清晰。我真正的问题再次变得稍微复杂一些,我正在努力了解在为不同的操作选择不同的值时,如何才能使这一点变得不重要。
发布于 2018-06-03 20:00:37
这里是一种无分点的方法。您要查找的主要函数是pipe
、evolve
和converge
。我不确定这是不是最好的方法,这是我能想到的最好的方法:
const { add, converge, evolve, map, multiply, pipe, prop, subtract } = R;
const myNumbers = [
{ top: 10, bottom: 5, rate: 5 },
{ top: 9, bottom: 4, rate: 3 },
];
const process = pipe(
evolve({
top: add(10),
bottom: multiply(2),
}),
converge(multiply, [
converge(subtract, [
prop('bottom'),
prop('top'),
]),
prop('rate'),
]),
);
console.log(map(process, myNumbers));
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
发布于 2018-06-04 02:40:02
如果这是一个编写无指针代码的练习,像@JeffreyWesterkamp这样的解决方案是很好的。
然而,对于生产代码,任何无指针的解决方案都将比这个简单版本的可读性差得多:
const process = ({top, bottom, rate}) => ((2 * bottom) - (10 + top)) * rate;
const myNumbers = [
{ top: 10, bottom: 5, rate: 5 },
{ top: 9, bottom: 4, rate: 3 },
];
console.log(R.map(process, myNumbers));
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.js"></script>
重点是不要迷恋无关紧要的东西。它是一个工具,有时使代码更容易阅读,更容易理解。但如果它不这样做,它就不值得使用。
别误会我的意思。我是无指针代码的铁杆粉丝,Ramda (免责声明:我是它的作者之一)有一些有用的工具来帮助你编写它。但是Ramda在其他代码中工作得很好。所以要明智地使用它。
还有一点(嗯):Ramda提供了两个非常不寻常的函数,useWith
和converge
,使编写无指针代码变得更容易。但是converge
通常可以被更标准的lift
所取代。它不能总是被替换,因为它有一些lift
不提供的处理可变函数的特性,但是当您可以使用lift
时,我建议您这样做。例如,它不是
converge(subtract, [prop('bottom'), prop('top')])
你可以这样写
lift(subtract)(prop('bottom'), prop('top'))
据我所知,目前还没有useWith
的标准替代品。但只要有可能,我都会用lift
替换converge
。
https://stackoverflow.com/questions/50664808
复制相似问题