2015-11-09 44 views
0

我有这样的ArrayBuffer,需要移除/删除的价值21.如何从ArrayBuffer的Javascript删除位置

位置我试图用.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 ...> 
+0

有了它,它会把00而不是21,我需要删除该位置。 – felipesmendes

回答

0

退房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)); 
+0

因此,如果我在我的情况下做arr.slice(24),它会返回没有21值的新的arraybuffer? – felipesmendes

+0

你能帮我吗? – felipesmendes

0

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