首页 > 代码库 > 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 生成笛卡尔积
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。