2016-12-14 56 views
2

我有一個Angular 2打字稿應用程序正在使用lodash的各種事情。lodash orderby具有空值和實際值不正確排序

我有我的對象使用屬性排序的對象數組...

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

這種運作良好,但我的問題是,有時「propertyName的」可以有一個空值。 這些按降序列表中的第一項進行排序,然後是最高的實際值。

我想使這些空值出現在降序排列的最後。

我明白爲什麼空值先來。

有誰知道如何解決這個問題?

回答

2

我需要看起來像這樣的代碼...

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

_.orderBy()_.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>

該檢查可以是簡單的,像我以前用過,所有falsy值轉換爲空字符串:

propertyName || '' 

如果您需要進行嚴格的檢查,你可以使用一個三元組並且僅處理null值:

propertyName === null ? '' : propertyName 
+0

非常接近,謝謝。我已經發布了下面的完整解決方案。 –

+1

爲什麼你需要所有額外的東西'[(o)=> {return o.myProperty || ''}]'?我的解決方案開箱即用。查看片段。只需將propertyName替換爲屬性的名稱即可。 –

+0

它似乎並不適合我的方式,但它是按照我的方式做到的。也許它是一種勞頓之類的東西。無論如何,問題現在都解決了。謝謝你的幫助。 –

0

礦山看起來是這樣的。 PROPNAME和排序都是變量,我的解決方案

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

我想tolowercase因爲否則的排序是不正確的,如果不同的外殼