如何从ArrayBuffer Javascript中删除位置

How to remove position from ArrayBuffer Javascript

本文关键字:删除 位置 Javascript ArrayBuffer      更新时间:2023-09-26

我有这个ArrayBuffer,需要移除/删除值21的位置。

我尝试使用.splice(24,1)delete array[24],但没有成功。。。

正确的方法是什么?

<Buffer 01 a6 31 35 cb 12 00 08 7d cb b8 ae c5 3e 2d 0e 1e d0 fe 29 4e 61 fd 01 21 a0 00 c0 03 00 00 00 00 00 00 00 00 00 04 24 03 19 15 cb 0b 3b 26 06 0b 31 00 ...>

您不能更改ArrayBuffer的大小,因此您不能只删除元素并使其消失。ArrayBuffer.prototype.slice将为您提供一个大小相同或更小的缓冲区副本,因此它本身也没有帮助。

您可以将位置N(在您的情况下为24)之后的所有条目向左移动,用N+1覆盖N,用N+2覆盖N+1等,最后修剪最后一个值。

function deleteWithShift(arrayBuffer, position) {
    var typedArray = new Uint8Array(arrayBuffer),
        i;
    for ( i = position+1; i < typedArray.length; i+=1 ) {
        ui8Array[i-1] = ui8Array[i];
    }
    return ui8Array.buffer.slice(0, ui8Array.length-1);
}

您还可以在位置之前和之后对缓冲区进行两次切片,然后合并这两个数组。

function deleteWithSliceAndMerge(arrayBuffer, position) {
    var frontValues = new Uint8Array( arrayBuffer, 0, position ),
        backValues = new Uint8Array( arrayBuffer, position+1 ),
        mergedArray = new Uint8Array(frontValues.length + backValues.length);
    mergedArray.set( frontValues );
    mergedArray.set( backValues, position );
    return mergedArray.buffer;
}

查看slice():

var buffer = new ArrayBuffer(12);
var dataView = new DataView(buffer);
dataView.setInt8(0, 0x12);
dataView.setInt8(1, 0x34);
dataView.setInt8(2, 0x56);
console.log(dataView.getInt32(0).toString(16)); 
console.log(dataView.getInt8(0).toString(16));
var dataView = new DataView(buffer.slice(1));
console.log(dataView.getInt32(0).toString(16)); 
console.log(dataView.getInt8(0).toString(16));