2012-02-08 3 views
5

이 모델을 상상해/컬렉션처럼 :Backbone.js/underscore.js의 비교기에서 멀티 레벨 정렬을 구현하는 방법은 무엇입니까?

var AModel = Backbone.Model.extend({ 
    defaults: { 
     a: 'a string', 
     b: 'another string', 
     c: 'yet another string' 
    } 
}); 

var ACollection = Backbone.Collection.extend({ 
    model: AModel, 
    comparator: function(amodel) { 
     ... 
    } 
}); 

어떻게 다단계 정렬을 구현하는 비교기를 쓸 수 있을까? AModela 속성으로 정렬 한 다음 b 속성으로 정렬 한 다음 c 속성으로 정렬하고 싶습니다.

나는 이와 비슷한 모양의 비교기를 해킹했지만 더 나은/더 똑똑한 방법이 있는지 알고 싶습니다.

comparator: function(amodel) { 
    var s = '', 
     assumed_max_length_of_any_attribute = 30; 

    s += amodel.get('a'); 
    while (s.length < assumed_max_length_of_any_attribute) { 
     s += ' '; 
    } 

    s += amodel.get('b'); 
    while (s.length < assumed_max_length_of_any_attribute) { 
     s += ' '; 
    } 

    s += amodel.get('c'); 
    while (s.length < assumed_max_length_of_any_attribute) { 
     s += ' '; 
    } 

    return s; 
} 

이어서, s 적절히 공간이 채워지고 다중 레벨 "사전"순서이어야한다.

collection.sort(key=lambda x: x.get('c')) 
collection.sort(key=lambda x: x.get('b')) 
collection.sort(key=lambda x: x.get('a')) 

더 나은 방법이 있나요 : (위의 파이썬에서 유사한 등가물을 가지고 어떻게 든 경우) 그러나 모든 파이썬의 안정적인 멀티 레벨 정렬의 아름다움에 비해 매우 심한 느낌?

답변

8

백본 문서는 말한다 :

비교기 함수는 sortBy (함수 하나의 인수를 취하는 을 패스), 또는 일종의 (두 개의 인수를 기대 비교기 기능을 패스로 정의 할 수 있습니다).

http://documentcloud.github.com/backbone/#Collection-comparator

는 주어진 두 가지 요소를 기준으로 비교를 두 번째 방법을 사용하여 구현할 수 있습니다. 이 같은

아마 뭔가 :

helper: function (c1, c2) { 
    if (c1 < c2) return -1; 
    if (c1 > c2) return +1; 
    return 0; 
} 
comparator: function (model1, model2) { 
    return _.reduce(["c", "b", "a"], function (acc, comp) { 
     return acc !== 0 ? acc : this.helper(model1[comp], model2[comp]) 
    }, 0); 
} 
+3

예,이 기능이 일주일 전에, 백본 0.9에 도입되었다. 버전 기록을 읽을 가치가 있습니다. – biziclop

+0

아, 글쎄 ... 내 백본을 업데이트해야한다고 생각한다. (나는 0.5.3에있다.) ... – dlamotte

+0

이 새로운 방법을 사용하여 someones 구현을 보니 좋겠다. – dlamotte

관련 문제