Разметка в 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.