Javascript 函数Ramda在作用域外传递函数参数

Javascript 函数Ramda在作用域外传递函数参数,javascript,functional-programming,composition,ramda.js,Javascript,Functional Programming,Composition,Ramda.js,以以下示例为例: getAnimalList = (hasCat) => { const baseAnimals = { dog: animLib.dog(), bear: animLib.bear()}; if(hasCat){ baseAnimals.cat = animLib.cat(); } return baseAnimals } 我试图用Ramda以函数式风格编写此代码,但唯一的方法是让函数超出范围: getAnimalList = (hasCat)

以以下示例为例:

getAnimalList = (hasCat) => {
  const baseAnimals = { dog: animLib.dog(), bear: animLib.bear()};
  if(hasCat){
    baseAnimals.cat = animLib.cat();
  }
  return baseAnimals
}
我试图用Ramda以函数式风格编写此代码,但唯一的方法是让函数超出范围:

getAnimalList = (hasCat) => {
  const baseAnimals = { dog: animLib.dog(), bear: animLib.bear()};
  return when(always(hasCat), merge({hasCat: animLib.cat()}))(baseAnimals)
}
撇开
animLib
如何超出范围不谈,我将修复
hasCat
从外部传递(如果这是一个问题)的方法如下:

getAnimalList = (hasCat) => {
  const baseAnimals = { dog: animLib.dog(), bear: animLib.bear()};
  const mergeCat = when(compose(equals(true), prop('hasCat')), 
              compose(merge({hasCat: animLib.cat()}), prop('baseAnimals')));
 return mergeCat({hasCat: hasCat, baseAnimals: baseAnimals});
}

但这使得代码极其冗长。有更好的方法吗?或者,冗长只是为了保持代码更加纯净而付出的代价。

在我看来,这样做很好:

getAnimalList = (animLib, hasCat) => {
  const baseAnimals = { dog: animLib.dog(), bear: animLib.bear()};
  return hasCat ? merge({hasCat: animLib.cat()}, baseAnimals) : baseAnimals;
}
因为Ramda的
when
ifElse
是基于谓词函数而不是布尔值的,所以在这里使用它们似乎有些过分

显然,如果您想要一个范围内有
animLib
的版本,您可以使用类似于Ramda的功能或只需更改为

getAnimalList = (animLib) => (hasCat) => { /* ... */ }

然后您可以创建
newAnimalList=getAnimalList(myAnimLib)

只需编写
getAnimalList=(hasCat)=>({dog:animLib.dog(),bear:animLib.bear(),cat:hasCat?animLib.cat():undefined})
。您的第二个代码片段似乎没有将
baseanimalist
传递到
合并中。“我要把这只猫从外面传过来“-不,我根本不明白你的问题是什么。这使代码更难重用。合并cat对象的组合函数不能轻易移动到其他地方,因为它依赖于定义的
hasCat
。另外,您的第一条注释将不起作用,因为我们不希望cat作为对象的属性。如果
hasCat==false
@ScottSauyet-Ah,您可能是对的。在这种情况下,
[“dog”,“bear”,“cat”].reduce((dict,name)=>({[name]:animLib[name](),…dict}),{}
可能是最好的方法,并且有条件地将
cat
放在原始列表中