2016-11-28 10 views
0

私は、単一要素とオブジェクトの配列のためのデカルト積に取り組んでいます。単一の配列要素の場合、私は解決策を理解しましたが、オブジェクトの配列に対して私は達成するのに苦労します。 例えば入力javascriptのオブジェクトの複数配列のデカルト積

cartesianProductOf([{col1:'A'}], [{col2:'B'},{col3:'C'}]) 

出力:

[{col1:'A',col2:'B'},{col1:'A',col3:'C'}] 

ここでは、私はこの機能は

[{col1:'A'},{col2:'B'}],[{col1:'A'},{col3:'C'}] 

この結果を返す

function cartesianProductOf() { 
    return Array.prototype.reduce.call(arguments, function(a, b) { 

     var ret = []; 
     debugger; 

     a.forEach(function(a) { 
       b.forEach(function(b) { 
       var r = a.concat([b]) 
       ret.push(r); 
      }); 
     }); 

     return ret; 

    }, [[]]); 
} 

に取り組んでいた機能ですガイダンスが必要です。

+0

あなたが削減を使用する必要がある理由はありますか? –

+0

実際のデカルト製品は実際には{{col1: 'A'}、{col2: 'B'}}、{{col1: 'A'}、{col3: 'C'}} 'です。しかし、javascriptオブジェクトは名前と値のペアでなければならないため、これは有効なjavascript構造ではありません。 – nurdyguy

答えて

1

代わりにプッシュする配列を使用して、あなたは、オブジェクトをマージする:あなたはObject.assignを使用したくないか、それはポリフィルなら

function cartesianProductOf() { 
    return Array.prototype.reduce.call(arguments, function(a, b) { 
     var ret = []; 
     a.forEach(function(a_el) { 
      b.forEach(function(b_el) { 
       ret.push(Object.assign({}, a_el, b_el)); 
//      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
      }); 
     }); 
     return ret; 
    }, [{}]); 
//  ^^ 
} 

、同等のようになり

    var r = {}; 
       for (var p in a_el) 
        r[p] = a_el[p]; 
       for (var p in b_el) 
        r[p] = b_el[p]; 
       ret.push(r); 
+0

ありがとう –

関連する問題