javascript - lodash orderby med null och riktiga värden sorteras inte korrekt


Jag har en Angular 2 TypeScript-applikation som använder lodash för olika saker.

Jag har en array av objekt som jag sorterar med hjälp av en egenskap i objektet...

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

Detta fungerar bra men mitt problem är att ibland kan 'propertyName' ha ett null-värde. Dessa ordnas som det första objektet i en fallande lista, de högsta verkliga värdena följer sedan.

Jag vill att dessa nullvärden ska visas sist i den fallande ordningen.

Jag förstår varför nollorna kommer först.

Vet någon hur man ska ta itu med detta?

Svar #1

Funktionens _.orderBy() iteratees kan använda en metod istället för en sträng. Kontrollera värdet, och om det är null returnera en tom sträng.

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>

Kontrollen kan vara enkel (som den jag har använt), som omvandlar alla falska värden till en tom sträng:

propertyName || ''

Om du behöver en striktare kontroll kan du använda ternära operatorn och hantera endast null-värden:

propertyName === null ? '' : propertyName

Redigera: Exempel med flera beställningar:

const result = _.orderBy(myArray, (item) => [get(item, 'propertyName', 0), get(item, 'propertyName2')], ['desc', 'asc']);

Detta kommer att sortera efter propertyName och sedan propertyName2.

Om propertyName är undefined/null kommer dess standardordning att sättas till 0. (och kommer därför att visas sist på grund av desc-sortering på propertyName-fältet). I ett sådant fall kommer propertyName2 därför att bestämma ordningen.

Svar #2

Koden jag behövde ser ut så här...

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

Relaterade artiklar