创建一个函数来旋转一个给定数量的步骤的int数组

时间:2018-02-03 16:15:37

标签: javascript arrays sorting

所以我做了一件事:

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);

不起作用。代码本身有一个问题,我认为是由未定义的[步骤]引发异常引起的,但我无法确定问题是什么而不能自己测试它。

如何测试功能的输出?

在一个较小的细节中,我现阶段的功能是否存在明显的问题?

3 个答案:

答案 0 :(得分:3)

该功能中的一些问题:

  • 可选step参数的语法不是[step],而只是step:在JavaScript中,所有参数都是可选的。但是,您可以在参数列表中为step = 1提供默认值。

  • 模2(%2)很奇怪:我看不出这对处理消极步骤有什么帮助。您可以使用以下公式处理所有步骤值:

    steps - Math.floor(steps / array.length) * array.length
    
  • 使用sliceconcat

  • 可以轻松完成很多代码
  • 您没有提供读取函数返回值的代码。优秀的做法是函数不会改变原始数组(所以保持这种方式),但是你可能希望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);