js 生成笛卡尔积
Posted dz45693
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 生成笛卡尔积的主要内容,如果未能解决你的问题,请参考以下文章
#pandas使用merge函数将两个pandas dataframe通过笛卡尔积(cartesian product)方式连接起来生成新的dataframe数据