【问题标题】:use lodash javascript to full join two-dimensional array使用 lodash javascript 完全加入二维数组
【发布时间】:2017-09-12 04:06:27
【问题描述】:

我有两个二维数组。

var arr1=[[1,20],[2,30]];
var arr2=[[2,40],[3,50]];

这是预期的输出:

[[1,20,null],[2,30,40],[3,null,50]]

这就像两个数据帧的完全连接。逻辑类似于这个伪代码:

df1.join(df2, df1[col_1] == df2[col_1], 'full')

但这种情况是针对二维数组的。洛达什可以做到这一点吗?如果没有,如何在 vanilla javascript 中做到这一点?

【问题讨论】:

    标签: javascript arrays join multidimensional-array lodash


    【解决方案1】:

    好吧,lodash 不能这样做,但我们可以:

    function flatten2d(arr1, arr2) {
      const o1 = _.fromPairs(arr1);
      const o2 = _.fromPairs(arr2);
      const result = [];
    
      _.forEach(o1, (v, k) => {
        const v2 = o2[k] || null;
        result.push([k|0, v, v2]);
        delete o2[k];
      });
    
      // at this point, only items non-existing
      // in o1 are left in o2
      _.forEach(o2, (v, k) => {
        result.push([k|0, null, v]);
      });
    
      return result;
    }
    

    测试:

    flatten2d([[1,20],[2,30]], [[2,40],[3,50]])
    

    结果:

    [[1,20,null], [2,30,40], [3,null,50]]
    

    【讨论】:

      【解决方案2】:

      如果您在任何单个数组中都没有重复的 id,那么您可以尝试将它们组合起来,并使用 groupBy 和第一个元素(即键 0)对它们进行分组,如果您有重复的,无论如何我是不确定您要寻找的究竟是什么输出!以下是您可以执行的操作:

          _(arr1.concat(arr2)).groupBy('0').map(v=>
              [v[0][0]].concat(v.length > 1 ? v.map(m=>m[1]) : [v[0][1], null])
          ).value();
      

      这是一个适合您的工作 sn-p:

      var arr1=[[1,20],[2,30]];
      var arr2=[[2,40],[3,50]];
      
      var res = _(arr1.concat(arr2)).groupBy('0').map(v=>
              [v[0][0]].concat(v.length > 1 ? v.map(m=>m[1]) : [v[0][1],null])
          ).value();
          
       console.log(JSON.stringify(res));
      <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>

      【讨论】:

      • 您的 sn-p 的输出与所讨论的不同。
      猜你喜欢
      • 2021-07-29
      • 2019-09-04
      • 2010-09-16
      • 2010-12-30
      • 1970-01-01
      • 1970-01-01
      • 2014-04-23
      • 2014-09-16
      • 1970-01-01
      相关资源
      最近更新 更多