5

JavaScript 配列をチャンクに分割する方法について大きな疑問があります。私は現在、私が書いているいくつかの統計的方法にこれを使用しており、私が使用している答えは次のとおりです(ただし、答えのように配列プロトタイプを拡張しないことを選択しました):

var chunk = function(array, chunkSize) {
    return [].concat.apply([],
        array.map(function(elem,i) {
            return i%chunkSize ? [] : [array.slice(i,i+chunkSize)];
        })
    );
};

これは、 などの配列を取り、2[1,2,3,4,5,6]の a が返されると、 が返されます。これを変更して「重複する」チャンクの配列を作成する方法に興味があります(または、移動平均、「移動サブグループ」などの方法に精通している場合)。 chunkSize[[1,2],[3,4],[5,6]]

上記と同じchunkSize3 つの配列を指定すると、 が返され[[1,2,3],[2,3,4],[3,4,5],[4,5,6]]ます。2の AchunkSizeが返され[[1,2],[2,3],[3,4],[4,5],[5,6]]ます。

これにアプローチする方法について何か考えはありますか?

4

3 に答える 3

5
function chunk (array, chunkSize) {
    var retArr = [];
    for (var i = 0; i < array.length - (chunkSize - 1); i++) {
        retArr.push(array.slice(i, i + chunkSize));
    }
    return retArr;
}

プロトタイプを拡張したい場合 (おそらくそのほうがよいでしょう)、次のようになります。

Array.prototype.chunk = function( chunkSize ) {
    var retArr = [];
    for (var i = 0; i < this.length - (chunkSize - 1); i++) {
        retArr.push( this.slice(i, i + chunkSize));
    }
    return retArr;
}
于 2013-02-20T17:26:36.053 に答える
-1

私は JavaScript があまり得意ではありませんが、2 つのネストされた for ループを使用すると、アルゴリズム的に非常に簡単に実現できます。これは C# での解決策です。これは非常に簡単に理解できるはずです。

これは、最適とは言えないデータ構造とすべてを使用しましたが、アルゴリズム自体は明らかです。

protected List<List<int>> Split(List<int> array, int chunkSize)
{
    List<List<int>> result = new List<List<int>>();

    for (int i = 0; i < array.Count - chunkSize; i++)
    {
        List<int> temp = new List<int>();
        for (int j = i; j < i + chunkSize; j++)
        {
            temp.Add(array[j]);
        }
        result.Add(temp);
    }

    return result;
}
于 2013-02-20T17:39:27.583 に答える