Поскольку у меня была та же проблема, и я не мог найти ничего «чистого», я подумал, что выложил свое решение. В этом примере я использую обратный цикл while
, поэтому я могу использовать splice
вместо slice
. Преимущество теперь в том, что splice () нужен только индекс и диапазон, где slice () нужен индекс и общее количество. Последний имеет тенденцию становиться трудным, зацикливаясь.
Недостатком является то, что мне нужно перевернуть стек при добавлении.
Пример:
кол = 4;
liCount = 35
для цикла со срезом = [0, 9]; [9, 18]; [18, 27]; [27, 35]
в обратном направлении при соединении = [27, 8]; [18, 9]; [9, 9]; [0, 9]
Код:
// @param (list): a jquery ul object
// @param (cols): amount of requested columns
function multiColumn (list, cols) {
var children = list.children(),
target = list.parent(),
liCount = children.length,
newUl = $("<ul />").addClass(list.prop("class")),
newItems,
avg = Math.floor(liCount / cols),
rest = liCount % cols,
take,
stack = [];
while (cols--) {
take = rest > cols ? (avg + 1) : avg;
liCount -= take;
newItems = children.splice(liCount, take);
stack.push(newUl.clone().append(newItems));
}
target.append(stack.reverse());
list.remove();
}