如何实现一个通用集合随机化器



让我们假设我打算实现一个随机化功能,像这样:

function Randomizer() {
    //Get random member name of object
    Object.prototype.getRandomKey = function() {
        var keys = Object.keys(this);
        return keys[Math.floor(Math.random() * keys.length)];
    };
    //Get random member value of object
    Object.prototype.getRandomElement = function() {
        return this[this.getRandomKey()];
    };
    //Get random index of array
    Array.prototype.getRandomKey = function() {
        return Math.floor(Math.random() * this.length);
    };
    //Get random element of array
    Array.prototype.getRandomElement = function() {
        return this[this.getRandomKey()];
    };
    //Get random return key of function result
    Function.prototype.getRandomKey = function() {
        var result = this.apply(this, arguments);
        return result && result.getRandomKey();
    };
    //Get random return member of function result
    Function.prototype.getRandomElement = function() {
        var result = this.apply(this, arguments);
        return result && result.getRandomElement(result.getRandomKey());
    };
    //Get random element name of what if supported
    Randomizer.getRandomKey = function(what) {
        if ((!what) || (["undefined", "number", "boolean"].indexOf(typeof what) >= 0)) {
            //unsupported
        } else if (typeof what !== "function") {
            return what.getRandomKey(arguments);
        } else {
            return Randomizer.getRandomKey(what.apply(this, arguments));
        }
    };
    //Get random element value of what if supported
    Randomizer.getRandomElement = function(what) {
        if ((!what) || (["undefined", "number", "boolean"].indexOf(typeof what) >= 0)) {
            //unsupported
        } else if (typeof what !== "function") {
            return what.getRandomElement(arguments);
        } else {
            return Randomizer.getRandomElement(what.apply(this, arguments)); 
        }
    };
}

我是这样初始化它的

Randomizer();

使用示例
function lorem(b, a) {
    return a.substring(1);
}
Randomizer.getRandomElement(lorem, "abcde");

我的问题如下:我如何修改Randomizer.getRandomKeyRandomizer.getRandomElement,以便我可以避免在lorem中定义b参数,该参数本质上是getRandomElement调用时的lorem对象本身?在调用apply之前,我可以用arguments对象做一些事情来摆脱它的第一个元素并在此之后传递参数吗?

在调用apply之前,我可以用arguments对象做一些事情来摆脱它的第一个元素并在此之后传递参数吗?

是的,slice做到了:

var slice = Array.prototype.slice;
….apply(this, slice.call(arguments, 1))

替代Array.prototype.slice的方法是使用ES6 rest参数:

Function.prototype.getRandomKey = function(ignoreFirstArg, ...args) {
  var result = this.apply(this, args);
  // ...
};

最新更新