Solución:
Puedes usar push()
, pop()
, shift()
y unshift()
métodos:
function arrayRotate(arr, reverse) {
if (reverse) arr.unshift(arr.pop());
else arr.push(arr.shift());
return arr;
}
uso:
arrayRotate(['h','e','l','l','o']); // ['e','l','l','o','h'];
arrayRotate(['h','e','l','l','o'], true); // ['o','h','e','l','l'];
Si necesitas count
argumento ver mi otra respuesta: https://stackoverflow.com/a/33451102
Versión genérica con seguridad de tipos que muta la matriz:
Array.prototype.rotate = (function() {
// save references to array functions to make lookup faster
var push = Array.prototype.push,
splice = Array.prototype.splice;
return function(count) {
var len = this.length >>> 0, // convert to uint
count = count >> 0; // convert to int
// convert count to value in range [0, len)
count = ((count % len) + len) % len;
// use splice.call() instead of this.splice() to make function generic
push.apply(this, splice.call(this, 0, count));
return this;
};
})();
En los comentarios, Jean planteó el problema de que el código no admite la sobrecarga de push()
y splice()
. No creo que esto sea realmente útil (ver comentarios), pero una solución rápida (aunque algo así como un truco) sería reemplazar la línea
push.apply(this, splice.call(this, 0, count));
Con este:
(this.push || push).apply(this, (this.splice || splice).call(this, 0, count));
Utilizando unshift()
en lugar de push()
es casi el doble de rápido en Opera 10, mientras que las diferencias en FF fueron insignificantes; el código:
Array.prototype.rotate = (function() {
var unshift = Array.prototype.unshift,
splice = Array.prototype.splice;
return function(count) {
var len = this.length >>> 0,
count = count >> 0;
unshift.apply(this, splice.call(this, count % len, len));
return this;
};
})();
Probablemente haría algo como esto:
Array.prototype.rotate = function(n) {
return this.slice(n, this.length).concat(this.slice(0, n));
}
Editar Aquí hay una versión de mutador:
Array.prototype.rotate = function(n) {
while (this.length && n < 0) n += this.length;
this.push.apply(this, this.splice(0, n));
return this;
}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)