web-dev-qa-db-ja.com

nullと実際の値が正しく並べられていないlodash orderby

Angular 2のTypeScriptアプリケーションがあり、さまざまな目的でlodashを使用しています。

オブジェクトのプロパティを使用して注文しているオブジェクトの配列があります...

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

これはうまく機能しますが、私の問題は、「propertyName」にnull値が含まれる場合があることです。これらは降順リストの最初の項目として順序付けられ、最も高い実際の値が後に続きます。

これらのnull値を降順で最後に表示したい。

ヌルが最初に来る理由を理解しています。

誰もがこれに取り組む方法を知っていますか?

15
Ben Cameron

必要なコードは次のようになります...

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

_.orderBy() の反復では、文字列ではなくメソッドを使用して、値を確認し、nullの場合は空の文字列を返します。

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>

チェックは、私が使用したもののように、すべての偽の値を空の文字列に変換する単純なものにすることができます。

propertyName || ''

より厳密なチェックが必要な場合は、三項演算子を使用して、null値のみを処理できます。

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

他の人への将来の参照のために、これを行うと、最後に偽の値で昇順にソートできます。

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

これは私のために働いた

orders = [{id : "1", name : "test"}, {id : "1"}];
sortBy = ["id", "name"];
orderby(
            orders,
            sortBy.map(s => {
                return (r: any) => {
                    return r[s] ? r[s] : "";
                };
            })),
        );
0
lars1595

これは悪い値を下部に置き、数値と文字列を区別します。

const items = [] // some list

const goodValues = isAscending => ({ value }) => {
    if (typeof value !== 'string' && isNaN(value)) {
        return isAscending ? Infinity : -Infinity
    }

    return value || ''
}

const sortedItems = orderBy(
    items,
    [goodValues(isAscending), 'value'],
    [isAscending ? 'asc' : 'desc']
)
0
Stephen

私はこのように見えます。 PropNameとsortはどちらも私のソリューションでは変数です

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

小文字にしたかったので、大文字と小文字が異なると並べ替えが正しくありません。

0
Johansrk