JavaScript数组rotate()

我想知道什么是旋转一个JavaScript阵列的最有效的方法。

我想出了这个解决方案,其中正n向右旋转阵列,向左旋转一个负n(长度

Array.prototype.rotate = function( n ) {
  this.unshift( this.splice( n, this.length ) )
}

然后可以这样使用:

var months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
months.rotate( new Date().getMonth() )

我的原始版本有一个缺陷,如Christoph在评论中指出,正确的版本是(额外的回报允许链接):

Array.prototype.rotate = function( n ) {
  this.unshift.apply( this, this.splice( n, this.length ) )
  return this;
}

是否有更紧凑和/或更快的解决方案,可能在JavaScript框架的上下文中? (没有提出的版本下面是更紧凑或更快)

有什么JavaScript框架有一个数组旋转内置? (仍然没有任何人回答)

类型安全,通用版本,它改变数组:

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

在评论中,Jean提出了一个问题,即代码不支持push()和splice()的重载。我不认为这是真正有用的(见评论),但一个快速的解决方案(有点黑客,虽然)将是替换行

push.apply(this, splice.call(this, 0, count));

与这一个:

(this.push || push).apply(this, (this.splice || splice).call(this, 0, count));

在Opera 10中使用unshift()而不是push()几乎是快两倍,而FF中的差异可以忽略不计;代码:

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;
    };
})();
http://stackoverflow.com/questions/1985260/javascript-array-rotate

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:JavaScript数组rotate()