javascript中多个对象数组的笛卡尔积

时间:2016-11-28 21:14:48

标签: javascript arrays cartesian-product

我一直在研究单个元素和对象数组的笛卡尔积。对于单个数组元素,我已经理解了解决方案但是对于我努力实现的对象数组。 例如输入

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

需要指导。

2 个答案:

答案 0 :(得分:1)

您想要合并对象,而不是使用数组来推送:

<xsl:template match="/E1EDP01">
    <xsl:variable name="pref" select="Z1EDP03[IDDAT='901']" />
    <xsl:choose>
        <xsl:when test="$pref">
            <xsl:value-of select="$pref/DATUM"/>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="E1EDP03[IDDAT='027']/DATUM"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

如果您不想使用Object.assign或它的polyfill,则相当于

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

答案 1 :(得分:-2)

这是使用Ramda.js的解决方案

UIStackView
const cartesianProduct = (...Xs) =>
  R.reduce(
    (Ys, X) =>
      R.map(R.apply(R.append), R.xprod(X, Ys)), 
    [[]],
    Xs
  )

const cartesianProductOf = (...objs) =>
  R.map(R.mergeAll, cartesianProduct(...objs))

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