Разметка в JavaScript
Пожалуйста, рассмотрите массив, например:
arrayAll = [1,2,3,4,5,6,7,8,9]
Есть ли пакет, который позволяет выполнять разбиение на разделы:
arrayALLPartionned = [[1,2,3],[4,5,6],[7,8,9]]
Я могу видеть, как это сделать с циклом for, но вы бы оценили функцию "pre-made", если она существует.
Ответы
Ответ 1
Если вы используете Underscore.js, вы можете реализовать это с помощью groupBy()
и values()
function partition(items, size) {
var result = _.groupBy(items, function(item, i) {
return Math.floor(i/size);
});
return _.values(result);
}
(Это менее уродливо в CoffeeScript.)
jsFiddle: http://jsfiddle.net/MW3BS/
Ответ 2
Я думаю, вам придется использовать цикл for, не знаю никаких встроенных функций...
Попробуйте эту функцию:
function splitarray(input, spacing)
{
var output = [];
for (var i = 0; i < input.length; i += spacing)
{
output[output.length] = input.slice(i, i + spacing);
}
return output;
}
Ответ 3
Здесь рекурсивное решение:
function partition(array, n) {
return array.length ? [array.splice(0, n)].concat(partition(array, n)) : [];
}
Это использует тот факт, что Array#splice
деструктивно удаляет указанные элементы и возвращает их как значение функции. Обратите внимание, что это уничтожит входной массив, оставив его пустым.
Ответ 4
Еще одно решение без внешней библиотеки:
function partition(items, size) {
var p = [];
for (var i=Math.floor(items.length/size); i-->0; ) {
p[i]=items.slice(i*size, (i+1)*size);
}
return p;
}
Демонстрация: http://jsfiddle.net/dystroy/xtHXZ/
Ответ 5
Я добавил это решение @dystroy jspref здесь и, похоже, работает в два раза быстрее, чем другие решения. Изменить: в Safari и Chrome, но не в Firefox
Здесь представлено функциональное решение стиля, чтобы добавить к нему ответы.
Это функция более высокого порядка, называемая toPartitions
, которая возвращает обратный вызов для метода уменьшения подчеркивания или метода сокращения собственного массива.
Пример использования:
[1,2,3,4,5,6,7,8,9].reduce( toPartitions( 3 ), [] );
Функция:
function toPartitions ( size ) {
var partition = [];
return function ( acc, v ) {
partition.push( v );
if ( partition.length === size ) {
acc.push( partition );
partition = [];
}
return acc;
};
}
Подобно Clojure partition, он не будет включать хвостовой раздел, если элементов недостаточно.
В вашем примере вы можете сделать:
arrayALLPartionned = arrayAll.reduce( toPartitions( 3 ), [] ) );
Если вы не хотите использовать это с reduce
, но просто имеете функцию, которая принимает размер массива и раздела, который вы могли бы сделать:
function partition ( arr, size ) {
return arr.reduce( toPartitions( size ), [] );
}
Следовательно, решение было бы просто:
arrayALLPartionned = partition( arrayAll, 3 );
Ответ 6
Прототип имеет функцию array.partition, а также функцию eachSlice(). Кажется, что everySlice() - это то, что вы ищете. Если вы используете jquery, есть плагин, чтобы использовать функции прототипа. Здесь ссылка на него... http://www.learningjquery.com/2009/02/implementing-prototypes-array-methods-in-jquery
Ответ 7
Вы можете написать свой собственный прототип для этого
Array.prototype.partition = function(length) {
var result = [];
for(var i = 0; i < this.length; i++) {
if(i % length === 0) result.push([]);
result[result.length - 1].push(this[i]);
}
return result;
};
Если вы предпочитаете не добавлять в собственный прототип, вы можете написать простую функцию:
var partition = function(arr, length) {
var result = [];
for(var i = 0; i < arr.length; i++) {
if(i % length === 0) result.push([]);
result[result.length - 1].push(arr[i]);
}
return result;
};
Вы можете видеть это в действии в этой демонстрации jsFiddle.