【问题标题】:Create object with Ramda使用 Ramda 创建对象
【发布时间】:2018-12-07 21:57:03
【问题描述】:

我想创建一个类似的函数:

const objectCreator = createObject({
  foo: functionFoo,
  bar: functionBar
})

objectCreator(42) // => { foo: functionFoo(42), bar: functionBar(42) }

所以这个想法是从一组应用于一个值的函数创建一个对象。用例是例如从唯一对象中提取不同的数据,并将此函数放入管道中。

我可以手动创建这样的函数,但是在 Ramda(或类似的)中是否已经存在用于此的函数?我想不通它是怎么命名的。

【问题讨论】:

  • 不要认为 Ramda 中有任何 single 函数可以做到这一点。

标签: javascript functional-programming ramda.js


【解决方案1】:

Map 可以满足您的大部分需求,只要您在其周围加上代码以提供正确的值即可。例如:

const createObject = specification => value => R.map(f => f(value), specification);

const objectCreator = createObject({
  foo: val => val * 2,
  bar: val => val + 1,
});

let result = objectCreator(42); // { foo: 84, bar: 43 }

或者如果你想让它被柯里化(这样你可以同时或单独传入规范和值):

const createObject = R.curry((specification, value) => R.map(f => f(value), specification))

let result = createObject({
  foo: val => val * 2,
  bar: val => val + 1,
}, 42); // { foo: 84, bar: 43 }

编辑:

如果输入的顺序颠倒了(即先取值,后指定),会更简单:

const createObject = value => R.map(f => f(value))

【讨论】:

  • 这只会导致 f 未定义的异常。
  • 这是一个优雅的解决方案,谢谢!我的误解是地图的行为。首先,我认为它接受一个对象并返回一个数组,所以我不知道如何编写这样的函数。然而,它接受一个对象并返回一个对象,保留密钥。
  • 现在有applySpec,请参阅下面的首选答案。再次感谢!
【解决方案2】:

applySpec 这样做:

const functionFoo = x => 'Foo: ' + x;
const functionBar = x => 'Bar: ' + x;

const objectCreator = applySpec({
  foo: functionFoo,
  bar: functionBar
});

objectCreator(42); // {"bar": "Bar: 42", "foo": "Foo: 42"}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    • 2020-02-29
    • 2016-08-30
    • 2019-06-05
    • 1970-01-01
    • 2020-01-13
    • 2020-06-28
    相关资源
    最近更新 更多