web-dev-qa-db-fra.com

lodash orderby avec des valeurs nulles et réelles non ordonnées correctement

J'ai une application Angular 2 TypeScript qui utilise Lodash pour différentes tâches.

J'ai un tableau d'objets que j'ordonne en utilisant une propriété dans l'objet ...

_.orderBy(this.myArray, ['propertyName'], ['desc']);

Cela fonctionne bien mais mon problème est que parfois 'propertyName' peut avoir une valeur nulle. Celles-ci sont classées comme le premier élément d'une liste décroissante, les valeurs réelles les plus élevées suivent.

Je veux que ces valeurs nulles apparaissent en dernier dans l'ordre décroissant.

Je comprends pourquoi les nuls viennent en premier.

Est-ce que quelqu'un sait comment aborder cela?

9
Ben Cameron

Le code dont j'avais besoin ressemble à ceci ...

_.orderBy(this.myArray, [( o ) => { return o.myProperty || ''}], ['desc']); 
5
Ben Cameron

Dans _.orderBy() iteratees, utilisez une méthode au lieu d'une chaîne, vérifiez la valeur et, si c'est null, renvoyez une chaîne vide.

const myArray = [{ propertyName: 'cats' }, { propertyName: null }, { propertyName: 'dogs' }, { propertyName: 'rats' }, { propertyName: null }];

const result = _.orderBy(myArray, ({ propertyName }) => propertyName || '', ['desc']);

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.2/lodash.min.js"></script>

La vérification peut être simple, comme celle que j'ai utilisée, qui convertit toutes les valeurs de fausseté en une chaîne vide:

propertyName || ''

Si vous avez besoin d'une vérification plus stricte, vous pouvez utiliser l'opérateur ternaire et gérer uniquement les valeurs null:

propertyName === null ? '' : propertyName
13
Ori Drori

Pour faire référence aux autres, vous pouvez le faire pour trier les valeurs de Falsey par ordre croissant à la fin.

items =>
  orderBy(
    items,
    [
      i => !!i.attributeToCheck,
      i => {
        return i.attributeToCheck ? i.attributeToCheck.toLowerCase() : ''
      }
    ],
    ['desc', 'asc']
  )
1
infinity

le mien ressemble à ceci. PropName et sort sont les deux variables de ma solution

return _.orderBy( myarray, [
  ( data ) => {
    if ( data[propName] === null ) {
        data[propName] = "";
    }
    return data[propName].toLowerCase();
    }
 ], [sort] );

Je voulais utiliser des majuscules car sinon, le tri n’est pas correct si différentes enveloppes

0
Johansrk