2013-05-10 7 views
1

백본 컬렉션이 있습니다. 여기서 반복하고 mdl.get ('group')을 찾습니다. 이것은 반환 : 나는 반환을 원하는 무엇백본 컬렉션에서 유사한 모델을 그룹화합니다.

[undefined, undefined, group, group, group, undefined, group, group, group, undefined, group, group]

그 그룹 모델의 배열 (또는 컬렉션)입니다 :

[undefined, undefined, [group], undefined, [group], undefined, [group] 내가 가장 좋은 방법을 생각하려고

: 오브젝트 '미정의'

  • 환류 관통

      대하여 반복
    • 를 변경하지 않고 값은
    • 객체 많은 _.groupBy 방법 같은

    내에서 배열로 축소 유사한 값으로 형제 자매를 발견,하지만 난 내 모델의 올바른 순서를 유지해야합니다 그 물체.

    나는 이것을 접근하는 방법에 대한 몇 가지 아이디어가 좋을 것입니다. 지금까지 나는이 문제를 올바르게 다루는 방법에 대해 비틀 거리고 있습니다.

    감사합니다.

  • +0

    추가 설명 : 여기에

    는 바이올린입니다 그들은 같은, 지정된 속성이있는 경우를 제외하고 일반적으로 일상에서 유사한 모델을 그룹화 얻을? – sixFingers

    +0

    이 오른쪽으로 들리면 유사한 모델이 주어진 속성에 따라 그룹화됩니다. 형제가이 속성 (정의되지 않음)을 갖지 않음으로써 분리되는 경우 모델의 다음 그룹으로 이동합니다. – gleddy

    답변

    1

    몇 가지 수정을 한 후에이 솔루션을 생각해 냈습니다. . 당신은 쉽게에서 드롭 할 수 있도록 당신이 밑줄 확장 또는 밖으로 Collection.prototype 방법 할 수 Array.prototype으로 확장 :

    Array.prototype.pack = function(field) { 
        var result = [], target, lastItem; 
        while(this.length > 0) { 
         var item = this.shift(); 
         if(item === undefined) { 
          target = result; 
         } else { 
          if(!lastItem || item[field] != lastItem[field]) { 
           target = []; 
           result.push(target); 
          } 
         } 
         target.push(item); 
         lastItem = item; 
        } 
        return result; 
    } 
    

    참고가 무거운 테스트되지 않았습니다, 그리고 확실히 그것은 수 세련 되겠지만 생각을해야합니다. 당신은 다음과 같이 사용할 수 있습니다 :

    모델과 같은 일반 배열입니다
    models.pack("name") 
    

    [정의되지 않은, {필드 : 값}].

    최대한 간결하게하려고했습니다. 작동중인 데모는 다음과 같습니다. http://jsfiddle.net/YZQ6v/

    +0

    와우, 거기에 결과를 사랑해. 도와 주셔서 감사합니다! – gleddy

    0

    이렇게하려면 collection.groupBy()를 사용할 수 있습니다. 그룹화 된 모델의 해시를 생성하려면 collection.map을 사용하여 형제를 모델에 매핑하십시오. http://jsfiddle.net/puleos/w7drB/

    var models = [ 
        {name: "Scott", group: "alpha"}, 
        {name: "Rose", group: "alpha"}, 
        {name: "Charles", group: "alpha"}, 
        {name: "Stan"}, 
        {name: "John"}, 
        {name: "Mary", group: "beta"}, 
        {name: "Dan", group: "beta"}, 
        {name: "Paul", group: "beta"}, 
        {name: "Grace"}, 
        {name: "Sarah", group: "omega"} 
    ]; 
    
    var SourceCollection = Backbone.Collection.extend({}); 
    
    var sourceCollection = new SourceCollection(models); 
    var grouped = sourceCollection.groupBy('group'); 
    
    sourceCollection.map(function(model) { 
        if(model.has("group")) { 
         model.set({siblings: grouped[model.get("group")]}); 
        } 
    }); 
    
    // sourceCollection with siblings 
    console.log(sourceCollection); 
    
    관련 문제