Lodash: ¿cómo hacer una clasificación que no distingue entre mayúsculas y minúsculas en una colección usando orderBy?

87

Revisé esta respuesta, pero para lograr el mismo resultado, es decir, para obtener una clasificación que no distinga entre mayúsculas y minúsculas, necesito usarla en orderBylugar de, sortByya que me da la capacidad de especificar el orden de clasificación .

La única forma que encontré para lograrlo fue crear una matriz "media" clonada asignada a minúsculas name:

const users = [
  { name: 'A', age: 48 },
  { name: 'B', age: 34 },
  { name: 'b', age: 40 },
  { name: 'a', age: 36 }
];

let lowerCaseUsers = _.clone(users);

lowerCaseUsers = lowerCaseUsers.map((user) => {
  user.name = user.name.toLowerCase();
  return user;
});

const sortedUsers = _.orderBy(lowerCaseUsers, ['name'], ['desc']);

console.log(sortedUsers);

Esto parece realmente caro e incluso será más complejo con múltiples clasificaciones y nombres de propiedades dinámicas.

¿Existe una idea mejor?


Aquí hay un Plunker: https://plnkr.co/edit/i1ywyxjFctuNfHtPTcgG

WhiteEleven
fuente

Respuestas:

188

La documentación especifica que puede pasar una función como "iteratee":

[iteratees = [_. identity]] (Array [] | Función [] | Objeto [] | cadena []): Las iteraciones por ordenar.

Para que puedas hacer

const users = [
  { name: 'A', age: 48 },
  { name: 'B', age: 34 },
  { name: 'b', age: 40 },
  { name: 'a', age: 36 }
];

const sortedUsers = _.orderBy(users, [user => user.name.toLowerCase()], ['desc']);
console.log(sortedUsers);
<script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.min.js"></script>

Felix Kling
fuente
1
Esto puede fallar en navegadores más antiguos.
Vaporizado
14
Si quiere decir que esto arrojará un error de sintaxis en el navegador que no es compatible con ES6, entonces sí, por supuesto. Dejaré la conversión de la función de flecha en una función "normal" (y consten var) como ejercicio para el lector.
Felix Kling
@TheCaptan: no hay ninguna razón por la que no debería hacerlo.
Felix Kling
2
Estoy intentando la pregunta de @ TheCaptan con lo siguiente, pero obtengo un error del compilador:const sortedUsers = _.orderBy(users, [user => user[propToSort].toLowerCase()], ['desc']);
im1dermike
1
@ im1dermike: probablemente desee usar .toString()antes de llamar a minúsculas allí, además, si desea usar property.somethingpara propToSort y similar, puede usar _.get(user, propToSort)(tal vez esto ayude a otra persona)
Soniku
10

Ordenar por múltiples propiedades:

const users = [
  { name: 'A', age: 48 },
  { name: 'B', age: 34 },
  { name: 'b', age: 40 },
  { name: 'a', age: 36 }
]

const nameSorter = user => user.name.toLowerCase()
const ageSorter = 'age'

const sortedUsers = _.orderBy(users, [nameSorter, ageSorter], ['desc', 'asc'])
MaxineHu
fuente
2

Puede combinar el ejemplo de Felix Kling con la función _.get para ordenar por atributos dinámicos anidados:

const _ = require('lodash');

let test = [{ a: {b:'AA'}},{a: {b:'BB'} }, {a: {b: 'bb'}}, {a:{b:'aa'}}];

let attrPath = 'a.b';

_.orderBy(test, [item => _.get(item, attrPath).toLowerCase()]);
Agustí Sánchez
fuente