【问题标题】:Does splice exist for TypedArrays or is there an equivalent?TypedArrays 是否存在 splice 或是否存在等价物?
【发布时间】:2015-08-26 16:39:55
【问题描述】:

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

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

【问题讨论】:

    标签: javascript ecmascript-6 typed-arrays


    【解决方案1】:

    所以 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])
    

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

    【讨论】:

    • 保留空格”是什么意思?
    • 顺便说一句,如果你想更接近地模拟Array::splice,你应该注意负指数(从最后开始计算)并使用elements = slice.call(arguments, 3)
    • 嗯,不,你不能。您可以通过将 undefined/null 值作为参数传递来插入它们,但您不能插入孔 - 为此您需要 delete。你的例子产生[1, null, 3],可能你的控制台有问题。
    【解决方案2】:

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

    不,因为TypedArrays 无法更改它们的大小。也没有 push/pop/shift/unshift 方法。

    如果要从数组中删除元素,通常将它们设置为 null,并在遍历数组时注意这些 null。这也避免了在删除元素后必须在所有元素周围移动。

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

    【讨论】:

      猜你喜欢
      • 2013-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-03
      • 2012-12-28
      • 1970-01-01
      相关资源
      最近更新 更多