我有一个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);
}
谢谢,
答案 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))
答案 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回答是正确的方法。