Javascript 将相同的参数应用于函数列表,并在每个结果之间执行操作

Javascript 将相同的参数应用于函数列表,并在每个结果之间执行操作,javascript,ramda.js,Javascript,Ramda.js,我有一个函数列表,每个函数都接受相同的参数,并返回一个数字。我想对每个函数应用一个参数,并对每个连续结果执行一个操作(在本例中为减法): const run = item => buyPrice(item) - sellPrice(item) - receivingCost(item); 是否有一种干净、无点的方法来创建此函数?使用Array.prototype.map()调用列表中的

我有一个函数列表,每个函数都接受相同的参数,并返回一个数字。我想对每个函数应用一个参数,并对每个连续结果执行一个操作(在本例中为减法):

    const run = item => buyPrice(item) -
                        sellPrice(item) -
                        receivingCost(item);

是否有一种干净、无点的方法来创建此函数?

使用
Array.prototype.map()
调用列表中的所有函数,然后使用
Array.prototype.reduce()
执行所有减法:

function run (item) {
    const funcs = [buyPrice, sellPrice, receivingCost];
    return funcs.map(f => f(item)).reduce((x, y) => x - y);
}

我不完全清楚你到底在问什么,但这就是你想要的吗?其思想是将函数保留在一个数组中,然后使用
R.reduce()
减去给定项的每个函数调用的结果

编辑-通过使用函数组合更新代码,以更严格地遵守
无点
标准

const reduce=R.reduce;
恒咖喱=R.咖喱;
常量juxt=R.juxt;
常数isNil=R.isNil;
变量项={
购买价格:5,
售价:8,
接收成本:1
};
const getBuyPrice=R.prop(“buyPrice”);
const getSellPrice=R.prop(“sellPrice”);
const getReceivingCost=R.prop(“receivingCost”);
const fns=[getBuyPrice,getSellPrice,getReceivingCost];
const getItemPrices=juxt(fns);
常量减法=咖喱((a,b)=>isNil(a)?b:a-b);
const subtract arr=减少(减法);
const subtractArrFromFirstValue=subtractArr(空);
const run=R.compose(从FirstValue、getItemPrices中减去ArrR);
console.log(运行(项))

这不是完全无点的,但我认为它考虑了某些复杂性:

const run = lift((b, s, r) => b - s - r)(buyPrice, sellPrice, receivingCost)
虽然我确信我们可以创建一个无点版本的
(b,s,r)=>b-s-r
,但我真的怀疑我们是否能找到一个具有表现力的版本


您可以在未隔离运行函数的

上看到这一点。在您的解决方案中,
run
不是结果吗?我希望它是一个可以用
item
调用的函数,并用于映射一个项数组。在函数中用一个项和一个函数数组作为参数是很简单的。@mhodges我不知道这是什么意思,所以我忽略了它。@Ben抱歉,没有注意到您正在定义一个函数。@Barmar如果您试图去自由点,为什么要在最后一步引入点?相反,
const run=R.compose(subtractArrFromFirstValue,getItemPrices)
。还要注意的是,
subtractArr
可以更简单地写成
reduce(subtract)
。如果您仍在使用库,
getProperty
与之相同。@ScottSauyet非常感谢您提供的提示。我对Ramda或无点编码没有做太多的研究,我只是通过观看前端大师课程了解到这一点,所以我没有想到一些最佳实践/简化。你说的完全有道理,我也相应地更新了我的答案。再次感谢。