превратить функцию в канал ramda / compose

#javascript #ramda.js

#javascript #ramda.js

Вопрос:

Я хотел бы включить эту функцию:

 const get1 = (v, d) => path(split(/[[].]/, d), v);
get1("a.d", {a:{d:"f"}})
  

в канал или функцию compose без необходимости ее использования таким образом:

 get1("a.d")({a:{d:"f"}})
  

Ответ №1:

Думаю, мне любопытно, почему по двум вопросам. Во-первых, что-то не так fn (a) (b) ? Я лично обнаружил, что теперь я склоняюсь к этому в первую очередь, даже когда мне это не нужно. Это просто личные предпочтения или там есть что-то более глубокое?

Во-вторых, почему вы хотите переписать идеально читаемую функцию для использования pipe / compose ? Я один из основателей Ramda, и мне нравится библиотека, но я, конечно, не вижу необходимости делать все без точек.

Что касается того, как, Hitmands уже дал разумный ответ, используя несколько странный Ramda useWith . Альтернативой является pipe / compose и передавать результаты в uncurryN :

 const get2 = uncurryN (2, pipe (split (/[[].]/), path))

console .log (get2 ("a.d", {a: {d: "f"}}))  
 <script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.js"></script>
<script> const {uncurryN, pipe, split, path} = R                     </script>  

Но любой из этих ответов кажется менее читабельным, чем оригинал.

Ответ №2:

Это должно помочь:

 const fn = R.useWith(R.path, [R.split('.'), R.identity]);

console.log(
 fn("a.d")({ a: { d: 'f' } }), //curried call
);
console.log(
 fn("a.d", { a: { d: 'f' } }), //call with two arguments
);  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.js" integrity="sha512-3sdB9mAxNh2MIo6YkY05uY1qjkywAlDfCf5u1cSotv6k9CZUSyHVf4BJSpTYgla YHLaHG8LUpqV7MHctlYzlw==" crossorigin="anonymous"></script>