Coffeescript для цикла рефакторинга - PullRequest
2 голосов
/ 21 ноября 2011

Я новичок в coffeescript и мне интересно, могут ли еще опытные пользователи предложить рефакторинг для следующего кода:

splitCollection: =>
  maxLength = Math.ceil(@collection.length / 3)

  sets = Math.ceil(@collection.length / maxLength)
  start = 0    

  for x in [1..sets]   
    if x != sets
      @render new BusinessUnits(@collection.models.slice(start, (maxLength + start)))
    else
      @render new BusinessUnits(@collection.models.slice(start, (@collection.length)))
    start+= maxLength

В coffeescript, похоже, нет цикла while, который, похоже, предлагает лучший механизм.

Любые предложения приветствуются.

Ответы [ 3 ]

5 голосов
/ 21 ноября 2011

Похоже, вы используете Backbone.js, который включает в себя Underscore.js, который имеет функцию groupBy.

Вы можете создать функцию "bucketNumber":

bucketNumber = (value, index) ->
    Math.floor( index / @collection.length * 3 )

Затем сгруппируйте свою коллекцию:

sets = @collection.groupBy bucketNumber

Теперь, принимая десять элементов, sets должно выглядеть примерно так:

{0: [{}, {}, {}], 1: [{}, {}, {}], 2: [{}, {}, {}, {}]}

Отсюда становится довольно просто

for bucketNumber, bucket of sets
    @render new BusinessUnits( bucket )

Вот jsFiddle , показывающий его в действии

1 голос
/ 21 ноября 2011

Вам не нужно отслеживать свою позицию дважды, достаточно x:

splitCollection: =>
    setSize = Math.ceil @collection.length / 3
    sets = Math.ceil @collection.length / maxLength

    for x in [1..sets]
        @render new BusinessUnits @collection.models[x * setSize...(x+1) * setSize]

Обратите внимание, что нет ничего плохого в передаче slice конца, превышающего длину массива.

0 голосов
/ 21 ноября 2011

Если я понимаю ваш код, вы хотите разделить массив на 3 части (последняя может содержать меньше элементов).В этом случае напишите повторно используемую абстракцию для задачи.Используя подчеркивание :

splitCollection: =>
  group_size = Math.ceil(@collection.size() / 3)
  _.each _(@collection.models).inGroupsOf(group_size), (group) ->
    @render(new BusinessUnits(group))

_.inGroupsOf можно записать:

_.mixin({
  inGroupsOf: function(array, n) {
    var output = [];
    for(var index=0; index < array.length; index += n) {
      output.push(array.slice(index, index+n));
    }
    return output;
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...