如何将大阵列切成较小的固定长度的块

时间:2014-03-23 06:48:20

标签: javascript arrays

我有一个10659503个元素的Float32Array。我想将它分块(拆分)成固定长度的小数组。怎么做?我已经尝试过这种方法,但它不起作用:

var LENGTH = 4096;

var chunking = function(data) {
    var chunks = [];
    for (var i = 0; i < data.length; i += LENGTH) {
        var index = ~~(i/LENGTH);
        var offset = i%LENGTH;
        if (offset === 0) {
            chunks[i] = data.subarray(i, LENGTH);
        }
    }
    console.log(chunks);
}

谢谢,

3 个答案:

答案 0 :(得分:2)

您可以使用Float32Array.subarray()获取原始数组的切片视图。

function chunking(data, length) {
    var result = [];
    for (var i = 0; i < data.length; i += length) {
        result.push(data.subarray(i, i + length));
    }
    return result;
}

console.log(chunking(new Float32Array(100), 12));

答案 1 :(得分:0)

试试这个:

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

http://jsfiddle.net/R3Ume/7/

答案 2 :(得分:0)

一般情况下,我会使用splice

来完成
function chunk(data, LENGTH) {
  var ret = [] 
  while (data.length) {
   ret.push(data.splice(0,LENGTH))
  }
  return ret
}

但是由于Float32Array在原型中没有这种方法(感谢@Felix Kling),它会变得更加复杂:

function chunk(data, LENGTH) {
  var ret = [] 
  while (data.length) {
   ret.push([].splice.call(data, 0, LENGTH))
  }
  return ret
}

但是,由于您可能希望避免在内存中来回处理数据,因此必须使用仅创建新ArrayBufferView的方法而不移动实际数据。这正是subarray方法正在做的事情。所以@thefourtheye回答是正确的方法。