我一直在研究单个元素和对象数组的笛卡尔积。对于单个数组元素,我已经理解了解决方案但是对于我努力实现的对象数组。 例如输入
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 :(得分: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)
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'}],
)
)