19

次のような配列を検討してください。

arrayAll = [1,2,3,4,5,6,7,8,9]

取得するためのパーティショニングを可能にするパッケージはありますか:

arrayALLPartionned = [[1,2,3],[4,5,6],[7,8,9]]

forループでこれを行う方法を見ることができますが、存在する場合は「事前に作成された」関数をいただければ幸いです。

4

7 に答える 7

20

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;
}
于 2012-07-05T13:45:44.997 に答える
17

再帰的な解決策は次のとおりです。

function partition(array, n) {
  return array.length ? [array.splice(0, n)].concat(partition(array, n)) : [];
}    

これは、指定された項目を破壊的に削除するという事実を利用してArray#splice、それらを関数値として返します。これにより、入力配列が破棄され、空のままになることに注意してください

于 2014-10-07T07:08:33.807 に答える
13

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/

于 2012-07-05T13:40:39.100 に答える
5

このソリューションを@dystroy の jspref hereに追加したところ、他のソリューションの 2 倍の速さで実行されるようです編集: Firefox ではなく Safari と Chrome で

ここでの回答の組み合わせに追加する機能的なスタイルのソリューションを次に示します。

toPartitionsこれは、アンダースコアの reduce メソッドまたはネイティブ配列の reduce メソッドのコールバックを返す、呼び出される高階関数です。

使用例:

[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 のパーティションと同様に、十分な要素がない場合、末尾のパーティションは含まれません。

あなたの例では、次のことができます:

arrayALLPartionned = arrayAll.reduce( toPartitions( 3 ), [] ) );

でこれを使用したくないreduceが、配列とパーティションサイズを取る関数がある場合は、次のようにします。

function partition ( arr, size ) {
    return arr.reduce( toPartitions( size ), [] );
}

したがって、解決策は次のようになります。

arrayALLPartionned = partition( arrayAll, 3 );
于 2014-11-18T14:30:28.260 に答える
4

外部ライブラリのないもう1つのソリューション:

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/

于 2012-07-05T13:50:56.660 に答える
1

Prototype には、array.partition 関数と eachSlice() 関数があります。eachSlice() が探しているもののように聞こえます。jquery を使用している場合は、プロトタイプ関数を使用できるプラグインがあります。ここにリンクがあります... http://www.learningjquery.com/2009/02/implementing-prototypes-array-methods-in-jquery

于 2012-07-05T13:33:12.430 に答える