【问题标题】:array.reverse() block-wise in flat arrayarray.reverse() 在平面数组中逐块
【发布时间】:2021-10-31 18:50:36
【问题描述】:

我正在编写一个像素动画,从 Unit8Array 中读取数据 5 帧,每帧 72 个二进制文件。现在我想将帧反转​​为反转动画。所以我的问题:

有没有办法按块反转,或者有人有创意,我怎么能这样做? (我不能只是向后跑,因为每一帧都需要前一帧的信息)

const myArr = [1,2,3,4,5,6,7,8];
console.log(myArr.reverse());//8,7,6,5,4,3,2,1 
//how to reach [7,8,5,6,3,4,1,2]?

//would work fine with 2D array,
//but don't have 2D
const my2D = [[1,2],[3,4],[5,6],[7,8]];

【问题讨论】:

  • 太棒了!它实际上是:) 你能解释一下吗? (尤其是下划线的作用)@CherryDT
  • 玩弄找到了解释……

标签: javascript arrays reverse


【解决方案1】:

应该这样做:

const reversed = myArr
  .map((_, i, a) => a[i ^ 1])
  .reverse()

它的工作方式是将每个数组元素映射到另一个元素,并通过使用 XOR 反转 1 位来更改索引(例如 4^1=5, 5^1=4, 6^1=7, 7 ^1=6 等),然后反转整个数组。

此技巧可用于任意 2 的幂:您可以使用 ^ 3 反转 4 个元素的组来翻转 1 和 2 位,使用 ^ 7 翻转 4、2 和 1 位和 8 组很快。 (如果您需要其他组大小,则必须使用更昂贵的操作,例如 i + size - 1 - 2 * (i % size)。)

map 使用多个参数调用回调 - 第一个是元素的值,但我们实际上并不需要它,因此我们将其分配给未使用的变量 _。第二个是索引,第三个是数组本身。实际上我们只需要索引,但是使用第三个参数我们可以避免在一行中写入两次数组的名称(myArr.map((_, i) => myArr[i ^ 1]) 也可以)。

注意:根据您的具体用例,也许另一种选择是在访问数据时对索引执行array.length - i ^ 1 操作,而不是创建新数组。

【讨论】:

  • 你忘记reverse()了吗?
  • 感谢您的解释。我现在使用 XOR 来处理帧与帧之间更改的 px。可能只是将比较的帧从上一个交换到下一个......我会看看哪个选项最有效(更少混乱)
【解决方案2】:

受 CherryDT 回答的启发,只需拨打map 即可完成:

const arr = [1,2,3,4,5,6,7,8];

console.log(
  arr.map((_, i) => arr[arr.length - i - 1 ^ 1])
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多