2017-08-14 32 views
0

我試圖用自定義命令[m,r,d,v,o]在屏幕上顯示對象列表。 我試過使用排序()功能,它適用於第一個和最後一個項目,但中間通過隨機。如何以角度顯示自定義排序順序中的列表?

我應該使用sort()函數來處理這種情況嗎?如果是這樣我做錯了什麼?

在UI中,我使用* ngFor循環訪問數組。即構建陣列

<div *ngFor="let stuff of sortedStuff; let i = index;"> 
    <div>want to display in the custom sort order here</div> 
    <ul><li> {{ stuff.someproperty }} <li></ul> 
</div> 

代碼:

var sortedStuff = stuff.splice(0); 
sortedStuff.sort((obj1) => { 
    if (obj1.propertyX === 'M') { 
     return -1; 
    } 

    if (obj1.propertyX!= 'M' && obj1.propertyX!= 'D' && obj1.productType != 'V' && obj1.propertyX!= 'O' && obj1.propertyX=== 'R'){ 
     return 1; 
    } 

    if (obj1.propertyX!= 'M' && obj1.propertyX!= 'R' && obj1.propertyX!= 'V' && obj1.propertyX!= 'O' && obj1.propertyX === 'D'){ 
     return 1; 
    } 

    if (obj1.propertyX!= 'M' && obj1.propertyX!= 'D' && obj1.propertyX!= 'R' && obj1.propertyX!= 'O' && obj1.propertyX === 'V'){ 
     return 1; 
    } 

    if (obj1.obj1.propertyX != 'M' && obj1.obj1.propertyX != 'D' && obj1.obj1.propertyX != 'V' && obj1.obj1.propertyX != 'R' && obj1.obj1.propertyX === 'O'){ 
     return 1; 
    } 
    return 0; 
}); 

回答

0

不,你不應該使用sort()。一個簡單的解決辦法是隻寫像一個自定義函數:導致使用

csorts(items: string[], order: string[]) { 
    let returnItems: string[] = []; 
    for (let ord of order) { 
     let ordered = []; 
     for (let item of items) { 
     if (item === ord) { 
      ordered.push(item); 
     } 
     } 
     returnItems = returnItems.concat(ordered); 
    } 
    return returnItems; 
    } 

let items = ['m','r','d','m','v','r','m','d','d','r'] 
let order = ['m','r','d','v','o'] 
let ordered = csort(items, order); 
console.log(ordered); 

...

[ 'm', 'm', 'm', 'r', 'r', 'r', 'd', 'd', 'd', 'v' ] 
2

沒有錯角在這裏,您使用的是內置Array#sort功能錯誤。

傳遞伊諾sort拉姆達是一個「比較功能」具有以下屬性(從鏈接的MDN):

如果的compareFunction被提供時,所述陣列元件根據的返回值排序比較功能。如果a和b是要比較的兩個元素,則:

  • 如果compareFunction(a,b)小於0,則將a排序爲低於b的索引,即a先到達。
  • 如果的compareFunction(A,B)返回0,離開a和b不變相對於彼此,但相對於所有不同的元素進行排序。注意:ECMAscript標準並不保證這種行爲,因此並非所有瀏覽器(例如,至少可以追溯到2003年的Mozilla版本)都尊重這一點。
  • 如果的compareFunction(A,B)是大於0,排序b鍵比較低折射率。 compareFunction(a,b)在給定一對特定元素a和b作爲其兩個參數時必須始終返回相同的值。如果返回不一致的結果,那麼排序順序是未定義的。

在你的代碼的funtion工作只用一個參數,這意味着沒有辦法正確比較來自陣列的兩個項目。


如果這不是您喜歡的方法,我可以使用sortBy from loash來推薦。它接受一個從對象中「抓取」一些數據的函數。抓取的數據比較原樣。