2017-09-28 14 views
1

2D配列のサブ配列の間にデカルト積を作成しようとしています。 私の2dArrayは次のようになります:var matrix = [[1,2,3], [4,5], [6,7,8],[9,10,11]];ですが、可変数の配列を持つことができます。私が使用2D配列の配列のデカルト積

機能は次のとおりです。

function cartesianProductOf() { 
    return Array.prototype.reduce.call(arguments, function(a, b) { 
    var ret = []; 
    a.forEach(function(a) { 
     b.forEach(function(b) { 
     ret.push(a.concat([b])); 
     }); 
    }); 
    return ret; 
    }, [[]]); 
} 

私はのような機能を使用しようとしました:cartesianProductOf(matrix)が、これはすべての結果を返しません。

私の問題は、この関数のパラメータとしてサブ配列を与える方法ですか?サブ配列で2次元配列を分割する方法や、私の場合に機能するように関数を変更する方法は?

誰もこの問題を解決する方法を知っていますか?

更新: http://jsfiddle.net/XHEJt/10/

var matrix = [[1,2,3], [4,5], [6,7,8],[9,10,11]]; 

console.log(cartesianProductOf([1,2,3], [4,5], [6,7,8],[9,10,11])); 


//the following line does not produce the same output 

console.log(cartesianProductOf(matrix)); 


function cartesianProductOf() { 
    return Array.prototype.reduce.call(arguments, function(a, b) { 
    var ret = []; 
    a.forEach(function(a) { 
     b.forEach(function(b) { 
     ret.push(a.concat([b])); 
     }); 
    }); 
    return ret; 
    }, [[]]); 
} 
+0

https://stackoverflow.com/a/12628791/6051131 – Rahel

+0

ありがとうございますが、これは私の質問と似ていません。私の問題は、この関数のパラメータとしてサブ配列を与える方法です。サブ配列で2次元配列を分割する方法や、私の場合に機能するように関数を変更する方法は? – HelenA

+0

ここに例があります:[link](http://jsfiddle.net/XHEJt/10/) – HelenA

答えて

0

arguments.length場合は、(作品)のパラメータを持つ関数呼び出しについて尋ねていると(動作しない)の配列で、あなたはチェックを挿入することができますがが1に等しければ、argumentsの最初の要素を減らす値として取る。

return Array.prototype.reduce.call(arguments.length === 1 
    ? arguments[0] 
    : arguments, function(a, b) { 
     // ... 
+0

ありがとう、ニナ!できます – HelenA