【发布时间】:2015-08-26 16:39:55
【问题描述】:
TypedArrays 是否存在或是否存在与 Array.prototype.splice 等效的内容?
我希望能够从 TypedArray 中删除一系列项目。
【问题讨论】:
标签: javascript ecmascript-6 typed-arrays
TypedArrays 是否存在或是否存在与 Array.prototype.splice 等效的内容?
我希望能够从 TypedArray 中删除一系列项目。
【问题讨论】:
标签: javascript ecmascript-6 typed-arrays
所以 ES6 中的 TypedArrays 不是经典的 Javascript 数组,而是更接近底层二进制缓冲区的 API (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays)。
由于splice 改变了数组的实际长度,因此它不能用于 TypedArrays (http://www.es6fiddle.net/idt0ugqo/)。
您可以通过创建自己的拼接来创建类似的行为(虽然会慢一些)。
这是一个简单的等价物,只是它没有考虑到 `splice.正如@bergi 评论的那样,我不允许负值。
function splice(arr, starting, deleteCount, elements) {
if (arguments.length === 1) {
return arr;
}
starting = Math.max(starting, 0);
deleteCount = Math.max(deleteCount, 0);
elements = elements || [];
const newSize = arr.length - deleteCount + elements.length;
const splicedArray = new arr.constructor(newSize);
splicedArray.set(arr.subarray(0, starting));
splicedArray.set(elements, starting);
splicedArray.set(arr.subarray(starting + deleteCount), starting + elements.length);
return splicedArray;
};
splice(new Uint8Array([1,2,3]), 0, 1); // returns Uint8Array([1,3])
【讨论】:
Array::splice,你应该注意负指数(从最后开始计算)并使用elements = slice.call(arguments, 3)
undefined/null 值作为参数传递来插入它们,但您不能插入孔 - 为此您需要 delete。你的例子产生[1, null, 3],可能你的控制台有问题。
TypedArrays是否存在或是否存在与Array.prototype.splice等效的内容?
不,因为TypedArrays 无法更改它们的大小。也没有 push/pop/shift/unshift 方法。
如果要从数组中删除元素,通常将它们设置为 null,并在遍历数组时注意这些 null。这也避免了在删除元素后必须在所有元素周围移动。
如果你真的需要这个,最好的办法是创建一个新数组并在其上复制元素(删除部分之前的元素,新的元素,然后删除部分之后的元素)。 @cdbitsky 为此提供了一个很好的实现。
【讨论】: