Estoy usando el último lodash, el siguiente código funciona, pero me gustaría eliminar la parte x => , ahora me veo obligado a usarlo porque no puedo usar una aplicación parcial con _.orderBy
const x = (r, f, o) => _.flow([_.cloneDeep, x => _.orderBy(x, [r], [o])])(r);¿Tiene alguna idea de cómo cambiar el código para que
const x = (r, f, o) => _.flow([_.cloneDeep, _.orderBy([r], [o])])(r);Puede usar _.rearg() y _.curry() para obtener una nueva función que acepte los datos ( x ) como el último parámetro y devuelva una nueva función si recibe menos de 3 argumentos:
const orderByCurried = _.curry(_.rearg(_.orderBy, [2, 0, 1]), 3); const fn = (r, f, o) => orderByCurried([f], [o])(r); No es más corta que una función de flecha x => , pero si la usas mucho...
Nota : _.orderBy() no afecta la matriz original, por lo que no necesita clonarlo primero.
Ejemplo (adaptado de la respuesta de VLAZ):
const orderByCurried = _.curry(_.rearg(_.orderBy, [2, 0, 1]), 3); const fn = (r, f, o) => orderByCurried([f], [o])(r); const users = [ { 'user': 'fred', 'age': 48 }, { 'user': 'barney', 'age': 34 }, { 'user': 'fred', 'age': 40 }, { 'user': 'barney', 'age': 36 } ]; const sorted = fn(users, 'age', 'asc'); console.log(sorted); console.log(users); <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js" integrity="sha512-WFN04846sdKMIP5LKNphMaWzU7YpMyCU245etK3g/2ARYbPK9Ub18eG+ljU96qKRCWh+quCY7yefSmlkQw1ANQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>Otra opción es cambiar a lodash/fp, que tiene todas las funciones con los argumentos en el orden correcto, y todas están curradas.
La forma más fácil de realizar esta tarea es usar Lodash FP , la compilación amigable con la programación funcional de Lodash. Expone las mismas funciones pero reorganiza los argumentos para mover los datos para que queden al final y luego los procesa automáticamente. Es más conveniente ya que simplifica muchas tareas de programación funcional y no necesita cambiar su código (aparte de usar la compilación correcta):
const x = (r, f, o) => _.flow([_.cloneDeep, _.orderBy([f], [o])])(r); const users = [ { 'user': 'fred', 'age': 48 }, { 'user': 'barney', 'age': 34 }, { 'user': 'fred', 'age': 40 }, { 'user': 'barney', 'age': 36 } ]; console.log(x(users, 'age', 'asc')); console.log(users); //unchanged <script src="https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)"></script>Si se encuentra en un entorno de módulos, puede seleccionar y elegir fácilmente las importaciones que utiliza:
import flow from 'lodash/flow'; import cloneDeep from 'lodash/cloneDeep'; // or import { flow, cloneDeep } from 'lodash'; import orderBy from 'lodash/fp/orderBy'; // or import { orderBy } from 'lodash/fp';Pero si solo tiene la compilación normal de Lodash, entonces puede usar la respuesta de Ori Drori para hacer el mismo tipo de modificación que hace Lodash FP.