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?
Le code dont j'avais besoin ressemble à ceci ...
_.orderBy(this.myArray, [( o ) => { return o.myProperty || ''}], ['desc']);
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
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']
)
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