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' ] ]