繁体   English   中英

如何从ArrayBuffer Javascript中删除位置

[英]How to remove position from ArrayBuffer Javascript

我有这个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 ...>

签出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));

您不能更改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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM