2016-11-28 35 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

感谢它的工作 –