Есть ли лучший способ использовать applySpec здесь - PullRequest
0 голосов
/ 12 апреля 2019

Я думаю, что избыточность здесь может быть удалена с помощью некоторой функции 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 ]

1 голос
/ 12 апреля 2019

Извлечение общей части обоих приложений в функцию и добавление возможности добавлять больше элементов в спецификацию, используя частичное приложение и распространение объекта .

Пример:

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>
0 голосов
/ 13 апреля 2019

Я думаю, вы можете немного упростить свои функции и относительно легко абстрагировать общие части.Здесь getActualProps делает то же самое, что и ваш applySpec / pickBy(identity) shuffle, с параметризованными фактическими полями.Тогда две функции (или библиотечные методы) могут быть записаны в терминах этого.

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>
...