所以我做了一件事:
function rotate(array, [steps]){
var array_length = array.length;
var real_steps = 1;
var new_array = [];
if (typeof steps !== 'undefined')
{
real_steps = steps;
}
else
{
steps = 1;
}
if (real_steps > array_length)
{
real_Steps = steps % array_length;
}
else if (real_steps < 0)
{
if (real_steps % 2)
{
real_steps = real_steps*(-1)+2;
}
else
{
real_steps = real_steps*(-1);
}
real_steps = steps % array_length;
}
else if (real_steps === 0)
{
return array;
}
for(var i=0; i<=array_length-real_steps; i++)
new_array[i] = array[i+real_steps];
for(var i=array_length-real_steps; i<array_length-real_steps;i++)
new_array[i] = array[i];
return new_array
}
该函数的目的是获取一个整数数组,并按给定的步数移动整数。如果未定义,则步骤默认为1。
我在测试程序时遇到了麻烦,只是简单地拍打了
var a = [1, 2, 3, 4];
rotate(a);
不起作用。代码本身有一个问题,我认为是由未定义的[步骤]引发异常引起的,但我无法确定问题是什么而不能自己测试它。
如何测试功能的输出?
在一个较小的细节中,我现阶段的功能是否存在明显的问题?
答案 0 :(得分:3)
该功能中的一些问题:
可选step
参数的语法不是[step]
,而只是step
:在JavaScript中,所有参数都是可选的。但是,您可以在参数列表中为step = 1
提供默认值。
模2(%2
)很奇怪:我看不出这对处理消极步骤有什么帮助。您可以使用以下公式处理所有步骤值:
steps - Math.floor(steps / array.length) * array.length
使用slice
和concat
您没有提供读取函数返回值的代码。优秀的做法是函数不会改变原始数组(所以保持这种方式),但是你可能希望a
修改rotate(a)
?无论如何,该函数的结果是返回,因此您只需将其输出或存储在变量中。
代码:
function rotate(array, steps = 1){ // Optional argument notation is not []
steps = steps - Math.floor(steps / array.length) * array.length; // works also OK for negative
return array.slice(steps).concat(array.slice(0, steps));
}
// Demo
var a = [1,2,3,4,5];
for (var step = -6; step < 7; step++) {
console.log('step ' + step + ' => ' + rotate(a, step));
}
.as-console-wrapper { max-height: 100% !important; top: 0; }
如果您需要通过该函数对数组进行变异,请使用splice
:
function rotate(array, steps = 1){ // Optional argument notation is not []
steps = steps - Math.floor(steps / array.length) * array.length; // works also OK for negative
array.push(...array.splice(0, steps));
}
// Demo
for (var step = -6; step < 7; step++) {
var a = [1,2,3,4,5]; // reset
rotate(a, step);
console.log('step ' + step + ' => ' + a);
}
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:2)
const array = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L"];
let newArray = [];
function rotate(array, steps){
for(i=0; i<array.length ; i++){
if(i+steps < array.length){
newArray.push(array[i+steps]);
} else {
newArray.push(array[i+steps-array.length])
}
}
}
rotate(array, 3);
console.log(newArray);
答案 2 :(得分:1)
该函数返回新的旋转数组,因此您必须将结果分配给:
a = rotate(a);