次のような配列を検討してください。
arrayAll = [1,2,3,4,5,6,7,8,9]
取得するためのパーティショニングを可能にするパッケージはありますか:
arrayALLPartionned = [[1,2,3],[4,5,6],[7,8,9]]
forループでこれを行う方法を見ることができますが、存在する場合は「事前に作成された」関数をいただければ幸いです。
次のような配列を検討してください。
arrayAll = [1,2,3,4,5,6,7,8,9]
取得するためのパーティショニングを可能にするパッケージはありますか:
arrayALLPartionned = [[1,2,3],[4,5,6],[7,8,9]]
forループでこれを行う方法を見ることができますが、存在する場合は「事前に作成された」関数をいただければ幸いです。
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;
}
再帰的な解決策は次のとおりです。
function partition(array, n) {
return array.length ? [array.splice(0, n)].concat(partition(array, n)) : [];
}
これは、指定された項目を破壊的に削除するという事実を利用してArray#splice
、それらを関数値として返します。これにより、入力配列が破棄され、空のままになることに注意してください。
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/
このソリューションを@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 );
外部ライブラリのないもう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/
Prototype には、array.partition 関数と eachSlice() 関数があります。eachSlice() が探しているもののように聞こえます。jquery を使用している場合は、プロトタイプ関数を使用できるプラグインがあります。ここにリンクがあります... http://www.learningjquery.com/2009/02/implementing-prototypes-array-methods-in-jquery