2014-09-02 3 views
0

개체 (이름 및 전자 메일 주소) 배열을 giver -> receiver paired array로 바꾸려고합니다. 각 반복은 수령인의 수금자로부터 수작업을 제거하여 모든 수령 회원이 고유 한 파트너를 얻게합니다.전자 메일 목록/컬렉션 셔플 및 밑줄/낮은 대시를 사용하여 페어링

나는 로다시를 사용하여 믹스 인을 만들었습니다. 브라우저가 작동하지 않는 경우가 있습니다. 아마도 while 섹션에 문제가 있습니다.

_.mixin({ 
    ldSanta: function (arr) { 
     var ret = [], 
      emailListCopy = _.assign(arr), 
      receiver = {}; 
     _.times(_.size(emailListCopy), function (i) { 
      receiver = arr[i]; 
      while (receiver === arr[i]) { 
       receiver = _.first(_.shuffle(emailListCopy)); 
      } 
      var pair = { 
       'giver': arr[i], 
        'receiver': receiver 
      }; 
      ret[i] = _.extend(pair); 
      emailListCopy = _.reject(emailListCopy, function (item) { 
       return item.name === receiver.name; 
      }); 
     }); 
     return ret; 
    } 
}); 

예 : http://jsfiddle.net/ezhsLw16/10

답변

2

emailListCopy에 남겨진 유일한 사람이 arr에있는 경우 while 회 돌이가 계속됩니다.

당신은 다음을 수행하여 원하는 결과를 얻을 수 있습니다 :

  1. 배열을 셔플한다. 이것은 기부자들의 배열입니다.
  2. 수신자 배열에 복사하십시오.
  3. 수신기 배열을 1만큼 오프셋합니다.
  4. zip을 사용하여 2 개의 어레이를 결합합니다.

이렇게하면 수신자가 수신자와 동일한 지 확인할 필요가 없습니다.

_.mixin({ 
    ldSanta: function (arr) { 
     if (arr.length < 2) { 
      throw "Invalid input, must have at least 2 people"; 
     } 
     var givers = _.shuffle(arr); 
     var receivers = _.clone(givers); 
     receivers.push(receivers.shift()); 
     var pairs = _.map(_.zip(givers, receivers), function(pair) { 
      return { giver: pair[0], receiver: pair[1] }; 
     }); 
     return pairs; 
    } 
}); 

Live Demo

+0

좋은 생각 (JSFiddle 지금은 조금 느린되고 있습니다). 무리 감사! – rickysullivan