首页 > 代码库 > js 生成笛卡尔积

js 生成笛卡尔积

其实网上生成 笛卡尔积的方法已经有很多,比如这一段code:

    this.discarts = function () {
            if (arguments.length < 2) return arguments[0] || [];
            return [].reduce.call(arguments, function (col, set) {
                var res = [];
                col.forEach(function (c) {
                    set.forEach(function (s) {
                        var t = [].concat(Array.isArray(c) ? c-0 : [c]-0);
                        t.push(s-0);
                        res.push(t);
                    })
                });
                return res;
            });
        }

就是把2个循环直接生成,缺点:

1.如果是3个数组, 那么应该是3层循环,怎么办。

2.在有些时候我们需要返回的是一个迭代器,比如要生成10000号码,discarts已经循环了10000次,如果业务需要对着10000个号码需要过滤,那么还需要循环10000次,这样可是不行的哦。

3. [].reduce.call这个可不是什么浏览器都有效的哦

那么修改后的code如下:

 this.combins = function () {
            if (arguments.length < 2) return arguments[0] || [];
            var args = Array.prototype.slice.call(arguments);
            var that = {
                index: 0,
                nth: function (n) {
                    var result = [],
                        d = 0;
                    for (; d < this.dim; d++) {
                        var l = this[d].length;
                        var i = n % l;
                        result.push(this[d][i]);
                        n -= i;
                        n /= l;
                    }
                    return result;
                },
                next: function () {
                    if (this.index >= size) return;
                    var result = this.nth(this.index);
                    this.index++;
                    return result;
                }
            };
            var size = 1;
            for (var i = 0; i < args.length; i++) {
                size = size * args[i].length;
                that[i] = args[i];
            }
            that.size = size;
            that.dim = args.length;
            return that;
        }

调用code:

   var a = combins([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
        var index = 0;
        while (c = a.next()) {
            index++;
            console.log(index+1+":"+c.join(‘‘));       
        }

由于时间关系,比较粗糙,有不当的地方还请大家指正。

js 生成笛卡尔积