Home  >  Article  >  Web Front-end  >  Magical rotate function

Magical rotate function

黄舟
黄舟Original
2017-02-15 14:21:113001browse

I want to introduce to you a magical rotate or array flip function. Let’s look at an example first:


var data = [1, 2, 3, 4, 5];

rotate(data, 1) // => [5, 1, 2, 3, 4]
rotate(data, 2) // => [4, 5, 1, 2, 3]
rotate(data, 3) // => [3, 4, 5, 1, 2]
rotate(data, 4) // => [2, 3, 4, 5, 1]
rotate(data, 5) // => [1, 2, 3, 4, 5]

I see it Is there any way? It doesn’t matter if you don’t see it, let me explain.

Take the first rotate(data,1) as an example, which is equivalent to all the elements from the first to the second to last being moved one position to the right, and the first to the last The element drew a half-moon arc and reached the first position.

And rotate(data,2) performs the same operation based on rotate(data,1).

rotate(data,3)Based on rotate(data,2)....

This is still It’s not over yet. The rotate function has more powerful functions. What will happen if you try to pass in a negative number?


rotate(data, -1) // => [2, 3, 4, 5, 1]
rotate(data, -2) // => [3, 4, 5, 1, 2]
rotate(data, -3) // => [4, 5, 1, 2, 3]
rotate(data, -4) // => [5, 1, 2, 3, 4]
rotate(data, -5) // => [1, 2, 3, 4, 5]


If you are careful, you may soon discover that this is the opposite process to rotatepositive numbers.

What will be the reaction if 0 is passed in?


rotate(data, 0) // => [1, 2, 3, 4, 5]

Flip 0 times, doesn’t it just do nothing? ^_^

This function can do almost anything :

Number arrays can be used, and other object arrays can also be flipped.


rotate(['a', 'b', 'c'], 1)     // => ['c', 'a', 'b']
rotate([1.0, 2.0, 3.0], 1)     // => [3.0, 1.0, 2.0]
rotate([true, true, false], 1) // => [false, true, true]

You can flip it as many times as you want! Even if it comes tens of thousands of times!


var data = [1, 2, 3, 4, 5]

rotate(data, 7)     // => [4, 5, 1, 2, 3]
rotate(data, 11)    // => [5, 1, 2, 3, 4]
rotate(data, 12478) // => [3, 4, 5, 1, 2]

Okay, after seeing so many magical features, let’s think about how to implement it.
Since there are three basic situations: positive numbers, negative numbers and zero, let’s defeat them one by one!

For positive numbers, write this function specifically:


if(typeof Array.prototype.shiftRight !== "function"){
    Array.prototype.shiftRight = function(n){
      while(n--){
        this.unshift(this.pop());
      }
    };
}

Then, for negative numbers, rely on this function with the opposite function:


if(typeof Array.prototype.shiftLeft !== "function"){
    Array.prototype.shiftLeft = function(n){
      while(n--){
        this.push(this.shift());
      }
    };
}


Finally, you just need to integrate it, and the rotate function will come out:

function rotate(array,n){
    //copy array
    array = array.slice(0);
    if(n > 0){
        array.shiftRight(n);
    }
    else if(n < 0){
        array.shiftLeft(-n);
    }
    return array;
}


The above is magical The content of the rotate function, please pay attention to the PHP Chinese website (www.php.cn) for more related content!





Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn