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); 

无效。

我应该怎么做?

https://plnkr.co/edit/MHv5AMEO3p9dxiNCvQ80?p=preview

在您的选择中,您没有正确传递对象 (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>