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

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

时间: 2025-01-19 22:52:52

js 生成笛卡尔积的相关文章

前端学习-使用JS库Leaflet.js生成世界地图并获取标注地址经纬度。

介绍:Leaflet是一个开源的JavaScript库,对移动端友好且对地图有很好的交互性. 大小仅仅只有 33 KB, 同时具有大多数地图所需要的特点. Leaflet设计的非常简单易懂, 同时具有很好的性能和易用性. 它在桌面端和移动端都工作的相当高效,并有大量的插件用于扩张Leaflet的功能.微信公众号:673399718嘻嘻demo图如下: 使用leaflet.js生成世界地图非常方便,配置参数记录下,有兴趣的可以看看本例中引入jquery操作dom.首先:在页面的头部引入css文件c

js生成随机数

1. /*----------------------------------js生成随机四位数用户删除---------------------*/ function mathRand() { var num=""; for(var i=0;i<4;i++) { num+=Math.floor(Math.random()*10); } return num; } 2.Math.floor() 方法 floor() 方法可对一个数进行下舍入. 例如: <script typ

JS生成随机数的各种函数

第一种方法 /* *@desc:生成随机字符串 *@remark:toString方法可以接收一个基数作为参数的原理,这个基数从2到36封顶.如果不指定,默认基数是10进制 */ function generateRandomAlphaNum(len) { var rdmString = ""; for (; rdmString.length < len; rdmString += Math.random().toString(36).substr(2)); return rdm

js生成某个范围内的随机数

根据random方法,Math.random()方法返回的是0到1的随机数(不包含0和1): ? 1 2 3 4 5 6 7 8 //生成k个m到n的随机数,返回数组     function Temp(m,n,k) {         var all = new Array();         for (var i = 0; i < k; i++) {             all[i] = Math.floor(Math.random()*(n-m) + m); //Math.floor

JS生成当月日历

JS生成当月日历,效果图 完整代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-e

js生成一个以零开头的八位数并且依次递增

条件:1八位数:2.以领开头:3.末尾要依次递增 <script type="text/javascript"> function RondomPass(number){ var arr = new Array; var arr1 = new Array("0","1","2","3","4","5","6","7"

真的了解js生成随机数吗

由js生成一切随机数的基础都是Math.random(),这个方法比较特别,生成的随机数落在的区间是[0,1),进行一次操作的话,js只能生成一个类似于[n,m)这样,左闭右开的区间.所以当有一些特殊需求的时候,就势必要进行一些其它的操作,下面对各种需求进行简单的分析: 生成任意区间的整数 全闭区间[n,m] 这种的最常见,大家都知道的那一长串公式:Math.floor(Math.random()*(m-n+1))+n; 就是生成这个全闭区间的方法.说到这个公式很多人都知道,但真正想明白的人估计

js生成随机数的方法小结

js生成随机数主要用到了内置的Math对象的random()方法.用法如:Math.random().它返回的是一个 0 ~ 1 之间的随机数.有了这么一个方法,那生成任意随机数就好理解了.比如实际中我们可能会有如下的需要: (1)生成一个 0 - 100 之间的随机整数,那么则可以: parseInt(100*Math.random()); 注意:因为Math.random()的返回值是包括0和1的,所以这里是有生成0和100的可能性的. (2)生成一个从 m - n 之间的随机整数,例如要生

java和js生成二维码

1. java生成二维码 1.1 依赖jar包配置(使用maven依赖) 1 <dependency> 2 <groupId>com.google.zxing</groupId> 3 <artifactId>core</artifactId> 4 <version>3.0.0</version> 5 </dependency> 6 <dependency> 7 <groupId>com.