可变数量的Javascript数组的垂直连接

56lgkhnf  于 2023-03-28  发布在  Java
关注(0)|答案(2)|浏览(162)

我需要以一种非常特定的方式收集数据。现在,数据以N个数组(数组)的形式出现,所有数组的长度都是M。对于给定的调用,M对于所有数组都是相同的。
所以下面的例子有N=2和M=3。最后嵌套数组的长度是可变的,可以是0或更大(但它将是长度为零的空数组)

[
  [
    ['a', 'b'], ['c'], ['d']
  ],
  [
    ['e'], ['f', 'g'], ['h']
  ]
]

我需要的是

[['a', 'b', 'e'], ['c', 'f', 'g'], ['d', 'h']]

我可以得到一个可行的答案,但它的毛,我希望有人有一个更优雅的方法。
以下是(某种)工作解决方案:

const gatheredData = [[]];
const final = _.forEach(startData, (array, arrayIndex) => {
  // This is intended to handle the basecase creation of empty arrays
  if (_.size(gatheredData) < arrayIndex) {
    gatheredData.concat([]);
  }
  gatheredData[arrayIndex].concat(array);
});

在我还没有深入研究的边缘情况下,这似乎也是错误的。

pvabu6sv

pvabu6sv1#

您可以使用mergeWith

const startData = [
  [ ['a', 'b'], ['c'], ['d'] ],
  [ ['e'], ['f', 'g'], ['h'] ]
];

const gatheredData = _.mergeWith(
  [[]], 
  ...startData, 
  (source1 = [], source2 = []) => source1.concat(source2)
  );

console.log( gatheredData );
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>
eqqqjvef

eqqqjvef2#

一个没有lodash的选项是首先Map数组中的嵌套数组,其中对于每个内部(叶)数组(例如:['a', 'b']),你连接一个数组,该数组包含同一索引处的所有内部元素(你可以通过Map所有其他数组来获得),例如:

const arr = [
  [['a', 'b'], ['c'], ['d']],
  [['e'], ['f', 'g'], ['h']]
];

const zipArrs = ([first = [], ...rest]) => first.map(
  (arr, i) => arr.concat(...rest.map(other => other[i]))
);

console.log(zipArrs(arr));

相关问题