2014-02-05 3 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에 의해 (가장 오래된에서에 막내) : 여기

는 내가 지금까지 가지고있는 것입니다. 결과 순서는 다음과 같습니다 Tywin, 스타 니스, Cersei, Aemon, Tyrion, Daenerys, 아리아

답변

1

그래, 알아 냈어.

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

sort 방법은 최소값에서 최대 값까지의 순서입니다. 문자에 아이가있는 경우
, 비교기는 문자가이 같은 명령을 받게됩니다 [1, (1/age)]

돌아갑니다 [0, (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; 
}