I have the array ["a", "b", "c", "d", "e"] I need a function to shift abc to the end of the array - ["d", "e", "a", "b", "c"]
            Asked
            
        
        
            Active
            
        
            Viewed 253 times
        
    1 Answers
4
            function rotate(a, n) {
  // The modulo here is a performance optimization... rotating by the length of the array has no effect. E.g. in this example, rotating 8 is the same as rotating 3.
  for (var i = 0; i < n % a.length; i++) {
    a.push(a.shift());
  }
}
var a = ["a", "b", "c", "d", "e"];
rotate(a, 3);
console.log(a);
// Output:
// [ 'd', 'e', 'a', 'b', 'c' ]
EDIT
Non-destructive version using slice:
function rotate(a, n) {
  n %= a.length;
  return a.slice(n).concat(a.slice(0, n));
}
var a = ["a", "b", "c", "d", "e"];
console.log(rotate(a, 3));
// Output:
// [ 'd', 'e', 'a', 'b', 'c' ]
EDIT2
In response to the follow-up question in a comment, here's how you would copy the elements instead of moving them. (This is the non-destructive version.)
function copy(a, n) {
  n %= a.length;
  return a.concat(a.slice(0, n));
}
var a = ["a", "b", "c", "d", "e"];
console.log(copy(a, 3));
// Output:
// [ 'a', 'b', 'c', 'd', 'e', 'a', 'b', 'c' ]
Or here's an in-place version of copy:
function copy(a, n) {
  for (var i = 0; i < n % a.length; i++) {
    a.push(a[i]);
  }
}
var a = ["a", "b", "c", "d", "e"];
copy(a, 3);
console.log(a);
// Output:
// [ 'a', 'b', 'c', 'd', 'e', 'a', 'b', 'c' ]
 
    
    
        user94559
        
- 59,196
- 6
- 103
- 103
- 
                    Great! How to change this function in order to copy elements? To get output: ['a', 'b', 'c', 'd', 'e', 'a', 'b', 'c' ] – MikeDiam Jul 14 '16 at 07:57
- 
                    Yes perfect. But if I use this function more than once - how can I copy to array next symbols? If I add "abc", at the next time I want to add "def" (depending on n parameter of your function) – MikeDiam Jul 14 '16 at 08:52
- 
                    @MikeDiam I'm not sure what you mean. Could you give an example of the input and output you're expecting? E.g. input: `['a', 'b', 'c'], 3`, output: ??? – user94559 Jul 14 '16 at 09:03
- 
                    I have done it by adding 3rd parameter to the function as s (times of function runs) a.push(a[i+n*(s-1)]); – MikeDiam Jul 14 '16 at 09:11
 
    