有没有更好的方法在这里使用applySpec

时间:2019-04-12 20:20:09

标签: javascript functional-programming ramda.js

我认为可以通过使用一些函数insde ramda来消除此处的冗余,但是我对这个库非常陌生,所以我想不起来。一些帮助将不胜感激

let lib = {
    getFormattedPropsForUser: R.compose(
        R.pickBy(R.identity),
        R.applySpec({
            username: R.prop('username'),
            password: R.prop('password')
        })),
    getFormattedQueryParamsForUser: R.compose(
        R.pickBy(R.identity),
        R.applySpec({
            _id: R.prop('_id'),
            username: R.prop('username'),
            password: R.prop('password')
        })
    )

};

2 个答案:

答案 0 :(得分:1)

将两个应用程序的公共部分提取为一个函数,并使用部分应用程序和object spread添加向规范添加更多项的功能。

示例:

const forUser = spec => R.compose(
  R.pickBy(R.identity),
  R.applySpec({
    ...spec,
    username: R.prop('username'),
    password: R.prop('password')
  })
)

const lib = {
  getFormattedPropsForUser: forUser(),
  getFormattedQueryParamsForUser: forUser({ _id: R.prop('_id') }),
}

const test = { _id: 'id', username: 'username', password: 'password' }

console.log(lib.getFormattedPropsForUser(test))

console.log(lib.getFormattedQueryParamsForUser(test))
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>

答案 1 :(得分:0)

我认为您可以相当简化您的功能,并且相对容易地抽象出公共部分。这里的getActualPropsapplySpec / pickBy(identity)随机播放的功能大致相同,但实际字段已参数化。然后可以用它来编写这两个函数(或库方法)。

const getActualProps = (names) => pickBy((v, k) => includes(k, names))

const getFormattedPropsForUser = getActualProps(['username', 'password'])
const getFormattedQueryParamsForUser = getActualProps(['_id', 'username'])


// Test
const fred = {_id: 1, name: 'fred', username: 'fflint', password: 'dino'}
const wilma = {_id: 2, name: 'wilma', username: 'wilma42'}
const barney = {_id: 3, name: 'barney', password: 'bam*2'}

console.log(getFormattedPropsForUser(fred))         //~> {password: "dino", username: "fflint"}
console.log(getFormattedQueryParamsForUser(fred))   //~> {_id: 1, username: "fflint"}
console.log(getFormattedPropsForUser(wilma))        //~> {username: "wilma42"}
console.log(getFormattedQueryParamsForUser(wilma))  //~> {_id: 2, username: "wilma42"}
console.log(getFormattedPropsForUser(barney))       //~> {password: "bam*2"}
console.log(getFormattedQueryParamsForUser(barney)) //~> {_id: 3}
<script src="https://bundle.run/ramda@0.26.1"></script><script>
const {pickBy, includes} = ramda    </script>