这是JavaScript中将数组中的每个元素加倍的正确方法吗?

ma8fv8wu  于 2023-04-10  发布在  Java
关注(0)|答案(4)|浏览(196)
let array = [1,2,3,4,5,6]
for (element of array){
  array[array.indexOf(element)]= element*2
}
console.log(array)

这是我写的将数组的每个元素加倍的代码,但我得到的输出是(6)[8,2,12,4,10,6]
我犯了什么错?
有人能告诉我这里的逻辑错误吗?

eiee3dmh

eiee3dmh1#

第一次循环时,你读取第一个元素并得到1,然后你找到第一个值为1的索引,并将其更改为2,这使得你的数组看起来像这样:[2,2,3,4,5,6]
第二次循环时,你读取第二个元素并得到2,然后你找到first索引,它的值是2,你把它改为4,这让你的数组看起来像这样:[4,2,3,4,5,6]
等等
使用经典的for循环并基于索引工作。

let array = [1,2,3,4,5,6]
for (let i = 0; i < array.length; i++){
  array[i]= array[i]*2
}
console.log(array)

还可以考虑使用map并使用具有双倍值的 new 数组覆盖array

let array = [1,2,3,4,5,6]
array = array.map(value => value * 2);
console.log(array);
q3qa4bjr

q3qa4bjr2#

如果你真的想使用你的语法,你可以克隆数组来修复。然而,这个答案只是为了示例。最好使用Quentin发布的解决方案。

let array = [1,2,3,4,5,6]
let clonedArr = [...array];
for (element of clonedArr){
 array[clonedArr.indexOf(element)]= element*2
}
console.log(array)
zxlwwiss

zxlwwiss3#

只是为了增加可能的替代方案的集合:如果你真的想改变原始数组的值,那么下面的方法也可以工作:

let array = [1,2,3,4,5,6]
array.forEach((_,i,a)=>a[i]*=2)
console.log(array)
hs1ihplo

hs1ihplo4#

得到意外输出的原因是在迭代原始数组时修改了原始数组。
当你修改数组时,你会改变元素的顺序和索引,这可能会导致意外的行为。在你的例子中,你会多次加倍一些元素,而其他元素则被跳过。
实现所需输出的更好方法是使用map方法,该方法将创建一个新数组,其中包含对原始数组中的每个元素调用提供的函数的结果。
下面是一个使用map将数组中的每个元素加倍的例子:

let array = [1, 2, 3, 4, 5, 6];
let doubledArray = array.map(element => element * 2);
console.log(doubledArray);

这应该会给予你输出:

[2, 4, 6, 8, 10, 12]

修改数组中每个元素的一种更安全、更有效的方法是使用forEach方法,该方法提供数组中每个元素的元素和索引,如下所示:

let array = [1, 2, 3, 4, 5, 6];
array.forEach((element, index) => {
  array[index] = element * 2;
});
console.log(array);

相关问题