javascript - 移动类型化 Javascript 数组的值?

标签 javascript arrays typed-arrays

我有一个类型化的 Javascript 数组 (Float32Array),我想在数组的开头一次插入一个值,并将所有其他值移动一个位置(最后一个值被删除) .

这是一个例子:
假设我已经初始化了大小为 3 的数组。 该数组当前保存值 [2.0, 7.2, 4.5],我想插入数字 8.1。结果应为 [8.1, 2.0, 7.2]

如果我使用普通的 JS 数组,这不会有问题 - 我可以使用诸如 .unshift().pop() 之类的函数,但这些方法不适用于类型化 JS 数组,因为它们改变了数组的大小。

有没有办法使用类型化的 Javascript 数组有效地实现这一点?

最佳答案

这是一种不涉及使用循环(在您这边)的方法。

  • 使用子数组时使用相同的底层 ArrayBuffer,而不是分配新的缓冲区
  • 与 Polywhirl 先生相比,这两个函数只是将值移动任意数量的步骤,并且不涉及插入任何值,因为我认为这也可以使其他用例受益,并使这两个函数更加“纯粹” 。所以它更适合名称左移/右移
  • 子数组+设置+填充是否更快/更内存友好?我不知道

const shiftRight = (collection, steps = 1) => {
  collection.set(collection.subarray(0, -steps), steps)
  collection.fill(0, 0, steps)
  return collection
}

const shiftLeft = (collection, steps = 1) => {
  collection.set(collection.subarray(steps))
  collection.fill(0, -steps)
  return collection
}

const float32 = new Float32Array([2.0, 7.2, 4.5]);

shiftRight(float32) // >>> [ 0, 2.0, 7.2 ]
float32[0] = 8.1 // [ 8.1, 2.0, 7.2 ] Place new value at head
console.log(float32)

shiftLeft(float32) // <<< [ 2.0, 7.2, 0 ]
float32.fill(4.5, -1) // [ 2.0, 7.2, 4.5 ] Place new value at tail
console.log(float32)

shiftRight(float32, 2) // >>> [ 0, 0, 2.0 ] shift right 2 steps
console.log(float32)

关于javascript - 移动类型化 Javascript 数组的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63342389/

相关文章:

javascript - 如何将两个下载的数组合并为一个 JSON 数组?

javascript - Uint8ClampedArray 替代或使 Uint8Array 产生字节值的钳制字符串

javascript - WebSocket 和发送时重用 ArrayBuffer

javascript - js正则表达式差异

javascript - 如何知道两个数组是否具有相同的值

javascript - Webpack:require.ensure 和额外的 vendor 包

javascript - 队列有问题

javascript - 如何在没有 FileReader 的情况下从 Blob 和 File 对象创建 ArrayBuffer 和数据 URI?

javascript - 解析 css 措施

javascript - "click image to display its id"及其陷阱