Angular 2のTypeScriptアプリケーションがあり、さまざまな目的でlodashを使用しています。
オブジェクトのプロパティを使用して注文しているオブジェクトの配列があります...
_.orderBy(this.myArray, ['propertyName'], ['desc']);
これはうまく機能しますが、私の問題は、「propertyName」にnull値が含まれる場合があることです。これらは降順リストの最初の項目として順序付けられ、最も高い実際の値が後に続きます。
これらのnull値を降順で最後に表示したい。
ヌルが最初に来る理由を理解しています。
誰もがこれに取り組む方法を知っていますか?
必要なコードは次のようになります...
_.orderBy(this.myArray, [( o ) => { return o.myProperty || ''}], ['desc']);
_.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
他の人への将来の参照のために、これを行うと、最後に偽の値で昇順にソートできます。
items =>
orderBy(
items,
[
i => !!i.attributeToCheck,
i => {
return i.attributeToCheck ? i.attributeToCheck.toLowerCase() : ''
}
],
['desc', 'asc']
)
これは私のために働いた
orders = [{id : "1", name : "test"}, {id : "1"}];
sortBy = ["id", "name"];
orderby(
orders,
sortBy.map(s => {
return (r: any) => {
return r[s] ? r[s] : "";
};
})),
);
これは悪い値を下部に置き、数値と文字列を区別します。
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']
)
私はこのように見えます。 PropNameとsortはどちらも私のソリューションでは変数です
return _.orderBy( myarray, [
( data ) => {
if ( data[propName] === null ) {
data[propName] = "";
}
return data[propName].toLowerCase();
}
], [sort] );
小文字にしたかったので、大文字と小文字が異なると並べ替えが正しくありません。