是否存在TypedArrays的拼接或是否存在等价物?

时间:2015-08-26 16:39:56

标签: javascript ecmascript-6 typed-arrays

对于TypedArrays,是否存在等效的Array.prototype.splice

我希望能够从TypedArray中删除一系列项目。

2 个答案:

答案 0 :(得分:3)

所以ES6中的TypedArrays不是经典的Javascript数组,而是更接近底层二进制缓冲区的API(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays)。

由于splice会改变数组的实际长度,因此它不能与TypedArrays(http://www.es6fiddle.net/idt0ugqo/)一起使用。

您可以通过创建自己的拼接来创建类似的行为(虽然它会更慢)。

这是一个简单的等价物,除了它没有考虑到拼接的所有细微差别。正如@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])

http://www.es6fiddle.net/idt3epy2/

答案 1 :(得分:3)

  

Array.prototype.splice是否存在TypedArrays的等效内容?

不,因为TypedArrays无法改变其大小。也没有push / pop / shift / unshift方法。

如果要从数组中删除元素,通常将它们设置为null,并在遍历数组时关注这些空值。这也避免了在被删除之后转移所有元素。

如果你真的需要这个,最好的办法是创建一个新的数组并在其上复制元素(删除部分之前的部分,新的部分,然后是删除部分之后的部分)。 @cdbitesky为此提供了很好的实现。