在反向数组 JavaScript 上调用 .map 的最快方法

mas*_*by3 0 javascript arrays reverse

基本上标题说的是:我希望能够调用.map反向数组,但我担心它会太慢,因为我必须多次执行此操作。

我知道以下方法有效:

let arr  = [1, 2, 3, 4, 5];
let rev_wrapped = arr.slice(0).reverse().map(item => `wrapped: ${item}`);
Run Code Online (Sandbox Code Playgroud)

结果rev_wrapped是:

[
  'wrapped: 5',
  'wrapped: 4',
  'wrapped: 3',
  'wrapped: 2',
  'wrapped: 1'
]
Run Code Online (Sandbox Code Playgroud)

我想知道是否有更快的方法来做到这一点,因为.reverse()完全反转数组,而我只需要以相反的顺序读取数据。

如果这是不可能的,我也可以使用一种数据结构,它允许我在开始时插入元素而无需太多的计算成本(因为类似的东西arr.splice(0,0,new_item)会在每次插入时完全重新排列数组)。

T.J*_*der 5

您当前的代码对数组进行了三遍(slice,进行复制;reverse,反转它;并map映射它)。如果性能是一个问题,并且您发现当前的方法太慢(我建议测量,而不是推测),那么您最好只使用一个简单的循环:

let arr  = [1, 2, 3, 4, 5];
let rev_wrapped = new Array(arr.length);
for (let i = 0, n = arr.length - 1; n >= 0; --n, ++i) {
    rev_wrapped[i] = `wrapped: ${arr[n]}`;
}
console.log(rev_wrapped);
Run Code Online (Sandbox Code Playgroud)

这只是对数组进行了一次遍历。

通常,new Array是一种反模式,但在现代 JavaScript 引擎中new Array(5)通常会预先分配存储(这是我最近了解到的并且令我惊讶的事情)。

  • 接受你的答案,因为它是最完整的。我最终做了一个简单的 `let result = arr.map((_, i) => \`wrapped ${arr[arr.length - 1 - i]}\`);` 因为从我的本地测试来看速度更快并且更短(我只需要它来填充和渲染表格)。 (2认同)