Javascript 如何合并UInt8数组的数组?
我有一个由几个UInt8数组组成的数组。 类似于此:Javascript 如何合并UInt8数组的数组?,javascript,arrays,typed-arrays,Javascript,Arrays,Typed Arrays,我有一个由几个UInt8数组组成的数组。 类似于此: [Uint8Array(16384)、Uint8Array(16384)、Uint8Array(16384)、Uint8Array(16384)、Uint8Array(16384)、Uint8Array(8868)] 如何将它们合并/连接/连接(不确定正确的术语是什么)到单个ArrayBuffer 这里的关键是我需要的输出必须是ArrayBuffer。您可以使用set方法。创建具有所有大小的新类型数组。 例如: var arrayOne =
[Uint8Array(16384)、Uint8Array(16384)、Uint8Array(16384)、Uint8Array(16384)、Uint8Array(16384)、Uint8Array(8868)]
如何将它们合并/连接/连接(不确定正确的术语是什么)到单个ArrayBuffer
这里的关键是我需要的输出必须是ArrayBuffer。您可以使用
set
方法。创建具有所有大小的新类型数组。
例如:
var arrayOne = new Uint8Array([2,4,8]);
var arrayTwo = new Uint8Array([16,32,64]);
var mergedArray = new Uint8Array(arrayOne.length + arrayTwo.length);
mergedArray.set(arrayOne);
mergedArray.set(arrayTwo, arrayOne.length);
替代方法:将键入的数组转换为“普通”数组。concat并再次创建它的类型数组
在您的情况下(解决方案):
这对我很有用:单_数组就是你想要的
var arrays = [Uint8Array(16384), Uint8Array(16384), Uint8Array(16384), Uint8Array(16384), Uint8Array(16384), Uint8Array(8868)]
var single_array = concat(arrays)
function concat(arrays) {
// sum of individual array lengths
let totalLength = arrays.reduce((acc, value) => acc + value.length, 0);
if (!arrays.length) return null;
let result = new Uint8Array(totalLength);
// for each array - copy it over result
// next array is copied right after the previous one
let length = 0;
for(let array of arrays) {
result.set(array, length);
length += array.length;
}
return result;
}
只需将其视为任何普通阵列:
var concatArray = new Uint8Array([ ...Uint8Array1, ...Uint8Array2, ...Uint8Array3 ]);
您可以使用一个helper函数以提供的顺序连接任意长度的数组 这看起来很好,很干净,但它也会在每次迭代时复制
acc
,因为spread运算符:
// arrays are Uint8Array[]
(arrays) => new Uint8Array(arrays.reduce((acc, curr) => [...acc, ...curr], []));
这看起来稍微长一点,但性能更高,因为acc
不会在每次迭代中传播,而是推送到并返回:
// arrays are Uint8Array[]
(arrays) => {
const flatNumberArray = arrays.reduce((acc, curr) => {
acc.push(...curr);
return acc;
}, []);
return new Uint8Array(flatNumberArray);
};
一个错误:
offset=
应该是offset+=
。还有一句主观的评论:第二个循环也可以使用forEach
(mergedArray.set(item,offset);offset+=item.length;
)
// arrays are Uint8Array[]
(arrays) => {
const flatNumberArray = arrays.reduce((acc, curr) => {
acc.push(...curr);
return acc;
}, []);
return new Uint8Array(flatNumberArray);
};