2017-06-14 28 views
2

我正在嘗試以下操作。考慮到這一點,我想對一些棒球運動員進行分類。經理應該位於最上方(按活躍姓名排序),然後我想對玩家或任何其他類型進行排序 - 可以通過激活並命名爲其他幾種類型。如何對不同的屬性執行自定義骨幹排序?

最重要的是,我在名稱上使用了不區分大小寫的自然對象。

這是一個例子列表:這些

[ 
    {type: 'manager', name: 'Michael A', active: true}, 
    {type: 'player', name: 'Abraham B', active: true}, 
    {type: 'player', name: 'Jason R', active: false}, 
    {type: 'manager', name: 'John A', active: true}, 
    {type: 'coach', name: 'Ron A', active: true}, 
    {type: 'player', name: 'Bobby A', active: false}, 
    {type: 'player', name: 'Bobby J', active: true} 
] 

排序應該產生:

[ 
    {type: 'manager', name: 'Michael A', active: true}, 
    {type: 'manager', name: 'John A', active: true}, 

    {type: 'player', name: 'Abraham B', active: true}, 
    {type: 'player', name: 'Bobby J', active: true} 
    {type: 'coach', name: 'Ron A', active: true}, 
    {type: 'player', name: 'Bobby A', active: false}, 
    {type: 'player', name: 'Jason R', active: false}, 
] 

有一件事我已經試過是一個case語句,但我不知道該怎麼做下一水平排序(名稱和活動)

comparator: function(person) { 
     switch (person.get('type')) { 
      case 'manager': return 1; 
      default: return 2; 
     } 
    } 
+0

@EmileBergeron這不僅是多個字段。這個問題還有另一個深度。 – KingKongFrog

+0

你的問題中描述的是多場排序的常見情況。 –

+0

@EmileBergeron請重新閱讀。你顯然不明白,它的2級排序,然後是多場排序。 – KingKongFrog

回答

2

通常你會使用||運算符來指定排序順序。但是,在您的情況下,基於條件的排序順序不適用。你並沒有明確排序,而是像蛋糕一樣分層排序。所以你需要修改你的排序功能。

var list = [{ 
 
    type: 'manager', 
 
    name: 'Michael A', 
 
    active: true 
 
    }, 
 
    { 
 
    type: 'player', 
 
    name: 'Abraham B', 
 
    active: true 
 
    }, 
 
    { 
 
    type: 'player', 
 
    name: 'Jason R', 
 
    active: false 
 
    }, 
 
    { 
 
    type: 'manager', 
 
    name: 'John A', 
 
    active: true 
 
    }, 
 
    { 
 
    type: 'coach', 
 
    name: 'Ron A', 
 
    active: true 
 
    }, 
 
    { 
 
    type: 'player', 
 
    name: 'Bobby A', 
 
    active: false 
 
    }, 
 
    { 
 
    type: 'player', 
 
    name: 'Bobby J', 
 
    active: true 
 
    } 
 
] 
 

 
list.sort(function(a, b) { 
 
    return compareActive(a, b) || compareType(a, b) || compareNames(a, b); 
 
}); 
 

 
function compareActive(a, b) { 
 
    if (a.active === b.active) { 
 
    return 0; 
 
    } else if (a.active === true) { 
 
    return -1; 
 
    } else { 
 
    return 1 
 
    } 
 
}; 
 

 
function compareNames(a, b) { 
 
    return a.name.localeCompare(b.name); 
 
}; 
 

 
function compareType(a, b) { 
 
    if (a.type === b.type) { 
 
    return 0; 
 
    } else if (b.type === 'manager') { 
 
    return 1; 
 
    } else if (a.type === 'manager') { 
 
    return -1; 
 
    } else { 
 
    return 0 
 
    } 
 
} 
 
console.log(list);

+0

謝謝。這個答案和使用||有什麼區別?運營商。 – KingKongFrog

+0

@KingKongFrog更新回答 – Rick

+0

@KingKongFrog讓我知道如果答案有問題 – Rick