如何将一个大数组分割成固定长度的小块

3

我有一个长度为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);
}

谢谢,

1
可能是将数组分成块的重复问题 - Felix Kling
还有更多 - Felix Kling
我已经尝试了你建议的几种方法,但都没有解决我的问题。上面的代码是我从那些帖子中收集来的。 - ket
请记住,类型化数组不继承自Array.prototype,因此,您必须编写Array.protoype.slice.call(arr, i)而不是例如arr.slice(i)。或者像您已经做的那样使用子数组。但总体方法是相同的。 - Felix Kling
3个回答

4
你可以使用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));

Float32Array 没有 .slice 方法。 - sabof
@sabof 请现在检查。 - thefourtheye
看起来不错,但每次尝试打开控制台时Chrome都会崩溃。 - ket
@ketnonting 请尝试使用一个小数组。 - thefourtheye
@ketnonting,请指点我进行修改 :) - thefourtheye
result[i] = data.subarray(i, i + BUFFER_LENGTH); // 不使用 push - ket

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的答案是正确的选择。


-1

试试这个:

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/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接