2016-11-28 34 views
0

我一直在研究單個元素和對象數組的笛卡爾積。對於單個數組元素,我已經理解了解決方案,但對於我努力實現的對象數組。 例如輸入javascript中的多個對象陣列上的笛卡爾積

cartesianProductOf([{col1:'A'}], [{col2:'B'},{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; 

    }, [[]]); 
} 

該函數返回該結果

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

功能需要指導。

+0

是否有你需要使用reduce的原因? –

+0

我相信這裏真正的笛卡爾積實際上是'{{col1:'A'},{col2:'B'}},{{col1:'A'},{col3:'C'}}'。但是,這不是一個有效的JavaScript構造,因爲JavaScript對象必須是名稱 - 值對。 – nurdyguy

回答

1

而不是使用一個數組來推的,要合併的對象:

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; 
    }, [{}]); 
//  ^^ 
} 

如果你不想使用Object.assign或它的填充工具,相當於將

    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

感謝它的工作 –