Impossible d’attraper les arguments dans «R.applySpec»: Ramda.js

Oct 14 2020

J'essaye essentiellement d'obtenir le code ci-dessous dans le R.applySpec.

const fn = ({target, count}) => R.unnest (R.zipWith (R.repeat) (target, count))

const Data = { 
  target : ["a", "b", "c"], 
  count : [1, 2, 3],
}

const data1= {
  result : fn (Data)
}
console.log ( 'data1:', data1.result);// ["a","b","b","c","c","c"]

Ce que je ne parviens pas à comprendre, c'est que les arguments fnduR.applySpec

const data2_applySpec = R.applySpec({
  result : R.lift ( R.zipWith ( fn )) ( R.prop ('target'),  R.prop ('count'))
})

const data2 = data2_applySpec(Data)
console.log ('data2:', data2);//ERROR

Comment puis-je modifier le fnpour le faire fonctionner? J'utilise Ramda.js. Merci.

REPL

Réponses

1 ScottSauyet Oct 14 2020 at 12:53

Je pense que vous rendez cela plus difficile qu'il ne devrait l'être.

Vous avez déjà applySpecstocké la fonction que vous souhaitez utiliser à l'intérieur fn.

Vous pouvez donc simplement écrire:

const fn2 = applySpec ({
  result: fn
})

Ou, si votre seule utilisation de fnest à l'intérieur de cet applySpecappel, alors insérez-le simplement:

const fn3 = applySpec ({
  result: ({target, count}) => unnest (zipWith (repeat) (target, count))
})

Et si vous avez un fétiche pour le code sans point, vous pouvez utiliser la technique décrite dans votre article précédent :

const fn4 = applySpec ({
  result: compose (unnest, apply (zipWith (repeat)), props (['target', 'count']))
})

(ou la version similaire d'Ori Drori.)

Tous ces éléments sont présentés dans cet extrait.

const fn1 = ({target, count}) => unnest (zipWith (repeat) (target, count))

const fn2 = applySpec ({
  result: fn1
})

const fn3 = applySpec ({
  result: ({target, count}) => unnest (zipWith (repeat) (target, count))
})

const fn4 = applySpec ({
  result: compose (unnest, apply (zipWith (repeat)), props (['target', 'count']))
})


const data = {target : ["a", "b", "c"], count : [1, 2, 3]}

console .log (fn1 (data))
console .log (fn2 (data))
console .log (fn3 (data))
console .log (fn4 (data))
.as-console-wrapper {max-height: 100% !important; top: 0}
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.min.js"></script>
<script> const {unnest, zipWith, repeat, applySpec, compose, apply, props} = R </script>

2 OriDrori Oct 14 2020 at 06:09

Vous pouvez utiliser un tableau de tableaux ([cible, nombre]) R.props, appliquer le tableau de tableau à R.zipWith(repeat), puis aplatir les résultats avec R.unnest:

const { applySpec, pipe, props, apply, zipWith, repeat, unnest } = R

const Data = { 
  target : ["a", "b", "c"], 
  count : [1, 2, 3],
}

const data2_applySpec = applySpec({
  result: pipe(props(['target', 'count']), apply(zipWith(repeat)), unnest)
})

const result = data2_applySpec(Data)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.min.js" integrity="sha512-rZHvUXcc1zWKsxm7rJ8lVQuIr1oOmm7cShlvpV0gWf0RvbcJN6x96al/Rp2L2BI4a4ZkT2/YfVe/8YvB2UHzQw==" crossorigin="anonymous"></script>