使用 Lodash JavaScript 实现二维数组的全连接。

3

我有两个二维数组。

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

但这个案例是针对二维数组的。lodash可以做到吗?如果不行,如何在原生JavaScript中实现?
2个回答

2

好的,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]]

1
如果您在任何单个数组中没有重复的ID,则可以尝试将它们合并,并使用第一个元素(即键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();

Here is an working snippet for you:

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>


你的代码片段输出和问题描述中的不一样。 - Styx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接