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
总是需要两个?为什么是这样?当你有一个参数时,还有其他功能吗?当你有三个时另一个?没有意义。
尚不完全清楚您要使用 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]
判断一个人是否有指定宠物的函数。
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
总是需要两个?为什么是这样?当你有一个参数时,还有其他功能吗?当你有三个时另一个?没有意义。
尚不完全清楚您要使用 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]