【问题标题】:Cartesian product on multiple array of objects in javascriptjavascript中多个对象数组的笛卡尔积
【发布时间】:2016-11-28 21:14:47
【问题描述】:

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

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

需要指导。

【问题讨论】:

  • 你有理由需要使用reduce吗?
  • 我相信这里真正的笛卡尔积实际上是{{col1:'A'},{col2:'B'}},{{col1:'A'},{col3:'C'}}。但是,这不是一个有效的 javascript 构造,因为 javascript 对象必须是名称-值对。

标签: javascript arrays cartesian-product


【解决方案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 或者它是 polyfill,则相当于

                 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);

【讨论】:

    【解决方案2】:

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

    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'}],
      )
    )
    <script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>

    【讨论】:

      猜你喜欢
      • 2022-01-17
      相关资源
      最近更新 更多