Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我试图在javascript中旋转此数组会导致跳过索引_Javascript_Arrays_Methods_Rotation - Fatal编程技术网

为什么我试图在javascript中旋转此数组会导致跳过索引

为什么我试图在javascript中旋转此数组会导致跳过索引,javascript,arrays,methods,rotation,Javascript,Arrays,Methods,Rotation,让arr=[1,2,3,4,5] 设步数=2 保持 设indlength=arr.length-1 for(设i=indlength;i>indlength-steps;i--){ 保持.取消移动(arr[i]) 等一下 } console.log(hold)您的代码不能按预期工作,因为您更改了取消移位值的索引。它从最后一个索引开始,然后变为零。结果是缺少一些值 通过始终使用最后一个索引,可以得到想要的结果 我不会使用一个数组作为源,并使用相同的对象引用操作另一个数组。为了保持方法的一致性,我

让arr=[1,2,3,4,5]
设步数=2
保持
设indlength=arr.length-1
for(设i=indlength;i>indlength-steps;i--){
保持.取消移动(arr[i])
等一下
}

console.log(hold)
您的代码不能按预期工作,因为您更改了取消移位值的索引。它从最后一个索引开始,然后变为零。结果是缺少一些值

通过始终使用最后一个索引,可以得到想要的结果


我不会使用一个数组作为源,并使用相同的对象引用操作另一个数组。为了保持方法的一致性,我只会使用其中一种方法

让arr=[1,2,3,4,5]
设步数=2
保持
设indlength=arr.length-1
for(设i=indlength;i>indlength-steps;i--){
控制台日志(hold.join(“”));
hold.unshift(hold[indlength]);//取最后一个值并使用hold而不是arr
hold.pop();
}

控制台日志(hold.join(“”))问题在于执行此操作时保留的引用
let hold=arr
您应该创建
arr
的真实副本/克隆

另一种方法是使用
扩展语法

让arr=[1,2,3,4,5],
步骤=2,
保持=[…arr],
indlength=arr.length-1;
for(设i=indlength;i>indlength-steps;i--){
停止移动(arr[i]);
hold.pop();
}
console.log(保持)

.as console wrapper{max height:100%!important;top:0;}
在您的代码中,问题是您在
let hold=arr
中使用了arr的引用

已经添加了代码的工作片段

另一种方法是使用和

设arr=[1,2,3,4,5]
设步数=2
让零件1=arr.拼接(-steps)

console.log(part1.concat(arr))
其他人已经描述了代码不工作的原因。一个简单的非突变选择是

const rotate=(步长,arr)=>arr.slice(-steps).concat(arr.slice(0,-steps))
log(旋转(2[1,2,3,4,5]))

console.log(rotate(-1[1,2,3,4,5])
这是可疑的
let hold=arr
您知道
hold
arr
都引用同一个数组,您没有复制,对吗?相同的引用是问题,请尝试使用此
let hold=[…arr]
请参阅以了解旋转数组的好方法。您正在递减
i
,但要添加到数组开头的下一个元素仍保留在相同的索引位置,在这种情况下
i=arr.length-1
您应该解释他的代码有什么问题,而不仅仅是发布您自己的代码。旋转数组的有效方法可以在问题@Barmar中找到,请参见编辑。谢谢你@Nina Scholz我无缘无故地让它变得超级复杂谢谢你@Ele,那么我创建的引用和你的副本之间有什么区别?为什么[…arr]被视为真实副本?@Helix您的方法是在
arr
hold
中保持相同的引用,因此
hold
中的修改会影响数组
arr
。现在,spread操作符正在执行以下操作,
[…arr]==[1,2,3,4,5]
,因此这是一个真正的拷贝/克隆。这是一个非常棘手且不明显的操作,因为您使用两个不同的数组来更改一个数组并保留另一个数组。@NinaScholz可能是为了避免在原始数组上发生任何突变。@Ele我先在没有引用/克隆的情况下尝试了它,但同样的情况发生了。我以为问题发生了,因为我对原始数组进行了变异。事实证明,我是在变异它,因为我没有创造一个像Ele提到的真正的克隆。如果不使用克隆,仍然无法理解为什么索引会这样跳过。