2013-04-19 11 views
7

Ich habe dieses Array:Shift-Array nach rechts in Javascript

var arr1 = ['a1', 'a2', 'a3', 'a4', 'a5']; 

Ich brauche es nach rechts zu verschieben, um 2 Stellen sagen, wie

arr1 = ['a4', 'a5', 'a1', 'a2', 'a3']; 

Diese für Linksverschiebung funktioniert:

arr1 = arr1.concat(arr1.splice(0,2)); // shift left by 2 

Ich bekomme:

arr1 = ['a3', 'a4', 'a5', 'a1', 'a2']; 

Aber ich weiß nicht, wie das Richtige zu tun verschieben ...

Antwort

15

Verschiebung nach rechts zu N Positionen == Verschiebung zu array.length - N Positionen links.

Also auf 2 Positionen für Ihr Array nach rechts verschieben - einfach nach links auf 3 Positionen verschieben.

Es gibt keinen Grund, eine andere Funktion zu implementieren, sobald Sie bereits eine Funktion haben. Plus-Lösungen mit shift/unshift/pop in einer Schleife wird kaum so effizient sein wie splice + concat

+0

Alle Kommentare zu downvote? – zerkms

+0

+1. Smarter als meine Antwort – gilly3

+1

nette Antwort +1. – Vinay

8

Sie können .pop() verwenden das letzte Element zu erhalten und .unshift() zu setzen an der Front:

function shiftArrayToRight(arr, places) { 
    for (var i = 0; i < places; i++) { 
     arr.unshift(arr.pop()); 
    } 
} 
5

.concat() Verwenden Sie sind ein Gebäude neues Array und ersetzt das alte. Das Problem dabei ist, dass wenn Sie andere Verweise auf das Array haben, diese nicht aktualisiert werden, so dass sie immer noch die unverschobene Version enthalten.

eine Verschiebung nach rechts zu tun, und tatsächlich das bestehende Array mutieren, können Sie dies tun:

arr1.unshift.apply(arr1, arr1.splice(3,2)); 

Die unshift() Methode ist variadische und .apply können Sie in einem Array- gespeichert mehrere Argumente übergeben wie Sammlung.

So mutiert die .splice() das Array von den letzten zwei entfernen und Rückkehr sie und .unshift() mutiert das Array durch die, die von .splice() an den Anfang zurück Zugabe.


Die linke Verschiebung würde nach rechts Verschiebung ähnlich neu geschrieben werden, da .push() auch variadische ist:

arr1.push.apply(arr1, arr1.splice(0,2));