Ramda,在函数中发送参数
Ramda, send args in function
const product = {
name: 'widget',
price: 10,
avgRating: 4.5,
shippingWeight: '2 lbs',
shippingCost: 2,
shippingMethod: 'UPS'
}
const getProps = R.pick(['name', 'price'])
const result = getProps(product) // {name: 'widget', price: 10}
在我的 getProps
中,我想动态发送密钥(名称和价格)。
类似于
const getProps = args => R.pick([..args]);
const result = getProps(['name', 'price'], product);
无效。
我应该怎么做?
在您的选择中,您没有正确传递对象 (as per the R.pick documentation)。
您可以这样做:
const product = {
name: 'widget',
price: 10,
avgRating: 4.5,
shippingWeight: '2 lbs',
shippingCost: 2,
shippingMethod: 'UPS'
}
const getProps = (obj, propsArr) => R.pick(obj, propsArr)
console.log(getProps(['name','price'], product))
console.log(getProps(['avgRating','shippingMethod'], product))
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>
或者您可以像这样解构传递的参数:
const product = {
name: 'widget',
price: 10,
avgRating: 4.5,
shippingWeight: '2 lbs',
shippingCost: 2,
shippingMethod: 'UPS'
}
const getProps = (...args) => R.pick(...args)
console.log(getProps(['name','price'], product))
console.log(getProps(['shippingCost','shippingMethod'], product))
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>
Ramda 方法是柯里化的,这意味着只要参数的数量小于元数(函数期望的参数数量),就会 return 编辑一个新函数。所以如果一个函数除了 fn(a, b, c),当柯里化时你可以做 fna = fn(a)
, fnab = fna(b)
, 等等...
与经典柯里化不同,在 ramda 中您还可以传递多个参数 - fnab = fn(a, b)
.
您想要的已经是 R.pick
工作的标准方式。它可以用一个参数调用,return 一个需要另一个参数的函数,或者你可以一次用所有参数调用它,并得到结果。
const product = {
name: 'widget',
price: 10,
avgRating: 4.5,
shippingWeight: '2 lbs',
shippingCost: 2,
shippingMethod: 'UPS'
}
const getProps = R.pick
console.log(getProps(['name','price'], product))
console.log(getProps(['shippingCost','shippingMethod'], product))
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>
const product = {
name: 'widget',
price: 10,
avgRating: 4.5,
shippingWeight: '2 lbs',
shippingCost: 2,
shippingMethod: 'UPS'
}
const getProps = R.pick(['name', 'price'])
const result = getProps(product) // {name: 'widget', price: 10}
在我的 getProps
中,我想动态发送密钥(名称和价格)。
类似于
const getProps = args => R.pick([..args]);
const result = getProps(['name', 'price'], product);
无效。
我应该怎么做?
在您的选择中,您没有正确传递对象 (as per the R.pick documentation)。
您可以这样做:
const product = {
name: 'widget',
price: 10,
avgRating: 4.5,
shippingWeight: '2 lbs',
shippingCost: 2,
shippingMethod: 'UPS'
}
const getProps = (obj, propsArr) => R.pick(obj, propsArr)
console.log(getProps(['name','price'], product))
console.log(getProps(['avgRating','shippingMethod'], product))
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>
或者您可以像这样解构传递的参数:
const product = {
name: 'widget',
price: 10,
avgRating: 4.5,
shippingWeight: '2 lbs',
shippingCost: 2,
shippingMethod: 'UPS'
}
const getProps = (...args) => R.pick(...args)
console.log(getProps(['name','price'], product))
console.log(getProps(['shippingCost','shippingMethod'], product))
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>
Ramda 方法是柯里化的,这意味着只要参数的数量小于元数(函数期望的参数数量),就会 return 编辑一个新函数。所以如果一个函数除了 fn(a, b, c),当柯里化时你可以做 fna = fn(a)
, fnab = fna(b)
, 等等...
与经典柯里化不同,在 ramda 中您还可以传递多个参数 - fnab = fn(a, b)
.
您想要的已经是 R.pick
工作的标准方式。它可以用一个参数调用,return 一个需要另一个参数的函数,或者你可以一次用所有参数调用它,并得到结果。
const product = {
name: 'widget',
price: 10,
avgRating: 4.5,
shippingWeight: '2 lbs',
shippingCost: 2,
shippingMethod: 'UPS'
}
const getProps = R.pick
console.log(getProps(['name','price'], product))
console.log(getProps(['shippingCost','shippingMethod'], product))
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>