Ramda zipWith,一个参数

Ramda zipWith, one argument

判断一个人是否有指定宠物的函数。

const person = {
  name: 'joe',
  pets: {
    dog: true,
    cat: false,
    fish: true
  }
}

const personHasPet = (pet: string) => R.pipe(R.path('pets', pet), R.equals(true));

const personHasPets = (listOfPets: string[]) => R.allPass(R.zipWith(personHasPet, listOfPets, listOfPets))(person); 

这行得通。但是,如您所见,我为 zipWith 提供了两个参数。那是因为 zipWith 需要两个参数。为什么是这样?

我只需要一个,因为我在 persHasPet 函数中只有一个参数。 zipWith总是需要两个?为什么是这样?当你有一个参数时,还有其他功能吗?当你有三个时另一个?没有意义。

https://ramdajs.com/docs/#zipWith

尚不完全清楚您要使用 zipWith 完成什么,但所提供的函数肯定是为处理两个列表而设计的,并且回调肯定应该采用两个参数。因此:

zipWith(fn, [a1, a2, a3, ... an], [b1, b2, b3, ... bn])
//=> [fn(a1, b1), fn(a2, b2), fn(a3, b3), ... fn(an, bn)]

这就是它的作用,"zipping" 通过对每对应用一个函数将两个列表组合在一起。

我认为您要查找的代码可能类似于以下内容,但我不太确定:

const personHasPet = compose (path, flip (append) (['pets']) )
const personHasPets = compose (allPass, map (personHasPet) )

const joe = {name: 'joe', pets: {dog: true, cat: false, fish: true}}

console .log (
  personHasPet ('dog') (joe),             //=> true
  personHasPet ('cat') (joe),             //=> false
  personHasPet ('fish') (joe),            //=> true
)

console .log (
  personHasPets (['dog', 'cat']) (joe),   //=> false
  personHasPets (['dog', 'fish']) (joe),  //=> true
)
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>
<script>const {compose, path, flip, append, allPass, map} = R        </script>

我也不确定 Ramda 实现是否比普通版本有任何优势

const personHasPet = (pet) => (person) => person .pets && person .pets [pet]