我有一个对象数组
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)
);
只要看一下这段代码就可以看到这两个函数已经变得非常嵌套,并不是特别清楚。我的真正问题再次稍微复杂一点,我正在努力看到在为不同的操作选择不同的值时如何使这一点无效。
答案 0 :(得分:2)
这是一个无点的方法。您正在寻找的主要功能是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>
答案 1 :(得分:2)
如果这是编写无点代码的练习,那么像@JeffreyWesterkamp那样的解决方案就可以了。
对于生产代码,任何无点解决方案都将比这个简单版本的 lot 更难阅读:
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));
&#13;
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.js"></script>
&#13;
重点是不要在没有点的情况下迷恋。它是一种有时使代码更易于阅读,更易于理解的工具。但如果它没有这样做,那就不值得使用了。
不要误会我的意思。我是无点代码的忠实粉丝,而Ramda(免责声明:我是其作者之一)有一些有用的工具可以帮助你编写代码。但Ramda与其他代码一起工作得很好。所以明智地使用它。
另一点(咳咳):Ramda提供了两个相当不寻常的函数useWith
和converge
,以便更容易编写无点代码。但converge
通常可以用更标准的lift
替换。它无法始终被替换,因为它具有一些用于处理lift
无法提供的可变参数函数的功能,但是当您可以使用lift
时,我建议您这样做。例如,而不是
converge(subtract, [prop('bottom'), prop('top')])
你可以写
lift(subtract)(prop('bottom'), prop('top'))
我所知道的useWith
没有标准替代品。但我会尽可能用converge
替换lift
。