Javascript 2个数组的笛卡尔积
我有两个数组,我想要一个笛卡尔积。例如: 客户阵列:Javascript 2个数组的笛卡尔积,javascript,jquery,Javascript,Jquery,我有两个数组,我想要一个笛卡尔积。例如: 客户阵列: [10,A] [11,B] 债务人阵列: [88,W] [99,X] 我想生成一个新的customerDebtor数组,其中包含: [10,A,88,W] [10,A,99,X] [11,B,88,W] [11,B,99,X] 我正在使用以下代码进行尝试: for (var i = 0; i < customerArray.length; i++) { for (var l = 0; l < debtorArray.
[10,A]
[11,B]
债务人阵列:
[88,W]
[99,X]
我想生成一个新的customerDebtor
数组,其中包含:
[10,A,88,W]
[10,A,99,X]
[11,B,88,W]
[11,B,99,X]
我正在使用以下代码进行尝试:
for (var i = 0; i < customerArray.length; i++) {
for (var l = 0; l < debtorArray.length; l++) {
$.each(customerArray[i], function (ndx, val) {
//???? push values into customerDebtorMatrix array
});
}
}
for(变量i=0;i
您不需要jquery来完成以下任务:
var customerArray = [[10,'A'],[11,'B']];
var debtorArray = [[88,'W'],[99,'X']];
var customerDebtorMatrix = [];
for (var i = 0; i < customerArray.length; i++) {
for (var l = 0; l < debtorArray.length; l++) {
customerDebtorMatrix.push(customerArray[i].concat(debtorArray[l]));
}
}
实际上,这将是 两个数组的kronecker产品的Javascript代码
function kronecker_product(a, b)
{
var i, j, k, al = a.length, bl = b.length, abl = al*bl, ab = new Array(abl);
i = 0; j = 0;
for (k=0; k<abl; k++)
{
if ( j>=bl) {j=0; i++;}
ab[k] = [].concat(a[i],b[j]);
j++;
}
return ab;
}
主要区别在于最终结果的分量数(长度),在kronecker中,长度应该是长度的乘积,而在笛卡尔坐标中,长度应该是总和
示例Kronecker
var a = ["a","b"], b = ["c","d"];
console.log(kronecker_product(a,b));
输出
[["a", "c"], ["a", "d"], ["b", "c"], ["b", "d"]]
[["a", "b"], ["c", "d"]]
笛卡尔示例
var a = ["a","b"], b = ["c","d"];
console.log(cartesian_product(a,b));
输出
[["a", "c"], ["a", "d"], ["b", "c"], ["b", "d"]]
[["a", "b"], ["c", "d"]]
concatMap在这里运行良好:
(function() {
'use strict';
// cartProd :: [a] -> [b] -> [[a, b]]
function cartProd(xs, ys) {
return [].concat.apply([], xs.map(function (x) {
return [].concat.apply([], ys.map(function (y) {
return [[x, y]];
}));
}));
}
return cartProd(["alpha", "beta", "gamma"], [1, 2, 3]);
})();
返回:
[["alpha", 1], ["alpha", 2], ["alpha", 3], ["beta", 1], ["beta", 2], ["beta", 3], ["gamma", 1], ["gamma", 2], ["gamma", 3]]
2017版
使用您的数据:
// Customer Array:
let c = [[10, 'A'], [11, 'B']];
// Debtor Array:
let d = [[88, 'W'], [99, 'X']];
您只需要一行:
或者,为了与不支持扩展语法的旧浏览器兼容:
let r = [].concat.apply([], c.map(c => (d.map(d => c.concat(d)))));
您可以看到console.log(r)代码>打印:
[ [ 10, 'A', 88, 'W' ],
[ 10, 'A', 99, 'X' ],
[ 11, 'B', 88, 'W' ],
[ 11, 'B', 99, 'X' ] ]
这正是你想要的
没有循环,没有对数组的推送,没有jQuery,只有几个简单的函数调用
有关两个以上的阵列,请参见以下答案:
好的,我听到了。但是,如果我想使用jquery,那会是什么样子?@Greg:你为什么要使用jquery呢?对于
循环,可以使用$。每个
而不是。但是,对于任何一款相当现代的浏览器,首先都有Array.prototype.forEach
。@Greg您需要一个嵌套的$。每个。它看起来像$.each(customerArray,function(k1,v1){$.each(debtorArray,function(k2,v2){customerDebtorMatrix.push(v1.concat(v2));});})代码>谢谢Nirk-看起来javascript语法更好(对于c#用户)。谢谢
[ [ 10, 'A', 88, 'W' ],
[ 10, 'A', 99, 'X' ],
[ 11, 'B', 88, 'W' ],
[ 11, 'B', 99, 'X' ] ]