Javascript 通过映射迭代数组和更改元素的哪种方法更有效?

Javascript 通过映射迭代数组和更改元素的哪种方法更有效?,javascript,arrays,dictionary,Javascript,Arrays,Dictionary,我有一个关于map的问题。正如您所知,通过使用map,我们可以迭代数组,并能够更改数组的元素。要做到这一点,有两种方法,我在下面列出了它们。哪种方法复杂度更低,性能更高?(在示例中,数组不大,但考虑现实世界,就像一个数组中有500个元素) 在这种方法中,将每个返回值分配给当前数组 numbers.map((e,a)=>{ numbers[a]=e*2; }) 在每一次迭代中,我们都需要按索引到数组中查找元素,我认为这比上面的情况更糟,但我不确定。语义上,当不需要新数组时,您需要for

我有一个关于map的问题。正如您所知,通过使用map,我们可以迭代数组,并能够更改数组的元素。要做到这一点,有两种方法,我在下面列出了它们。哪种方法复杂度更低,性能更高?(在示例中,数组不大,但考虑现实世界,就像一个数组中有500个元素)

在这种方法中,将每个返回值分配给当前数组

numbers.map((e,a)=>{
  numbers[a]=e*2;
})

在每一次迭代中,我们都需要按索引到数组中查找元素,我认为这比上面的情况更糟,但我不确定。

语义上,当不需要新数组时,您需要
for
forEach
。 对于足够小的阵列,性能没有差异

var数=[4,9,16,25];
数字。forEach((e,i)=>数字[i]=e*2);

console.log(数字)
如果不打算使用它创建的数组,请不要使用
map
。如果您只想在数组中循环,请使用循环或
forEach
或类似工具

无论是否需要新数组,在数组中循环的最有效方法通常是
for
循环:

const numbers = [4, 9, 16, 25];
for (let i = 0, len = numbers.length; i < len; ++i) {
    numbers[i] = numbers[i] * 2;
}
const number=[4,9,16,25];
for(设i=0,len=numbers.length;i
(或其上的任何一种变体。)

但是在现实世界的代码中,“最有效”实际上不太可能起作用,所以使用
map
(如果您需要新数组)或
forEach
(如果您不需要)之类的东西就可以了<代码>映射
是该操作的惯用方法(创建一个新数组,其中包含以前以某种方式修改的数组中的条目)

结论:

如果您想要一个新的数组,可以随意使用
映射
,或者创建一个空白数组,并使用循环原始数组并向新数组添加条目

如果不需要新数组,请不要使用
map
,使用任何选项对原始数组进行迭代(不提供索引的选项除外),并将更新后的值分配回条目。

nums.forEach((v,i)=>nums[i]=v);

是您列出的最快的方法(相当于第二种方法。为什么?
nums=nums.map(…)
在内存中创建数组的整个副本,并用该副本替换数组。当您仅使用索引和替换元素在数组上进行迭代时,您可以避免创建该副本,并且它最终会快15%左右(请参阅。

更改数组值的最快方法是迭代索引并更新项

这种方法比
forEach
map
更有效,因为它没有
This
的开销,也不需要提供的回调结构的特性

var数=[4,9,16,25];
对于(设i=0;i控制台日志(编号);
如果不需要新数组,则无需使用映射。只需使用forEach正如我所知,映射的复杂性比forEach低,但差异非常小。映射创建新数组并允许表示可链接的函数变换。它通常更优雅地表示直接变换对象形状。另一种方式是变异a性能通常可以忽略不计,但就地变异可以避免对象初始化,因此,如果要操作的数据量非常大,则性能会更好。
.map()
.forEach()
的“复杂性”基本相同,尽管是因为
.forEach()
不会创建新的数组,它的“复杂度”稍低。如果使用
forEach
代替
map
则第二种方法将更有效,它将节省空间,但不会影响时间。“…我不喜欢…”-这是一个观点,而不是一个答案。@Andreas这既是一个答案,也是我非常同意的东西。我改变了我的语意以不触发你;)“…是可能的最快方法…”不,一个
for
循环是,因为它避免了所有的函数调用。这不太可能有什么关系,因为函数调用真的很快。:-)所以你认为for循环比forEach复杂度低?那么为什么forEach比for循环更受欢迎呢?这取决于它的用途。@Timuçinçiçek-forEach过去如此受欢迎的原因之一是它为“循环”的“体”中的变量提供了一个包含的范围早在JavaScript有块作用域之前。现在JavaScript有块作用域和
for of
循环,您可以看到
forEach
少得多。。。
const numbers = [4, 9, 16, 25];
for (let i = 0, len = numbers.length; i < len; ++i) {
    numbers[i] = numbers[i] * 2;
}