2014-02-05 71 views
0

如何通過兩個屬性對集合的模型進行排序?按多個字段排序集合

這是我到目前爲止有:

Character = Backbone.Model.extend(); 

Characters = Backbone.Collection.extend({ 
    model: Character, 
    comparator: function(character){ 
     return [character.get('children') != undefined, character.get('age')] 
    } 
}); 

var myCharacters = new Characters([ 
    { name: 'Cersei', age: 32, children: 3 }, 
    { name: 'Aemon', age: 100    }, 
    { name: 'Tyrion', age: 24    }, 
    { name: 'Stannis', age: 33, children: 1 }, 
    { name: 'Daenerys', age: 14    } 
    { name: 'Tywin', age: 54, children: 3 }, 
    { name: 'Arya',  age: 9    }, 
]); 

myCharacters.sort; 

的模型應該由children進行排序(他們有子女或沒有),然後通過age(從舊到新)。 產生的順序應該是:泰溫,史坦尼斯,瑟曦,Aemon,提利昂,丹妮莉絲,艾莉亞

回答

1

好吧,我想通了。

Characters = Backbone.Collection.extend({ 
    model: Character, 
    comparator: function(c){ 
     return [c.get('children') ? 0 : 1, 1/c.get('age')]; 
    } 
}); 

sort方法從最小值到最大值的順序。
如果角色有孩子,比較器將返回[0, (1/age)]
品(沒有孩子),它會返回[1, (1/age)]

的字符將這樣被下令:

Tywin [0, 0.019] 
Stannis [0, 0.030] 
Cersei [0, 0.031] 
Aemon [1, 0.010] 
Tyrion [1, 0.042] 
Daenerys [1, 0.071] 
Arya  [1, 0.111] 
0

嘗試了這一點。

比較:功能(CHAR1,CHAR2){

 var child1 = char1.get("children"); 
    var child2 = char2.get('children'); 
    var ageDiff = char1.get("age") - char1.get("age"); 
    if(child1 && child2){ 
     var diff = child1 - child2; 
     if(diff !=0) return diff; 
     return ageDiff; 
    } 
    if(!child1 && !child2) return ageDiff; 
    if(child1) return 1; 
    return -1; 
}