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 till0. (och kommer därför att visas sist på grund avdesc-sortering påpropertyName-fältet). I ett sådant fall kommerpropertyName2dä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']);
