如何将多维数组折叠为具有公共值的单个数组?

时间:2019-01-25 22:30:00

标签: javascript arrays multidimensional-array

编辑后可以更清楚地了解我的问题:

我有一个像这样的多维数组

var data = [
   [2017,   1,       0,       0,       0,       0],
   [2017,   0,       0,       23,      0,       0],
   [2017,   0,       0,       0,       0,       9],
   [2017,   0,       12,      0,       0,       0],
   [2017,   0,       0,       0,       18,      0]
];

我正在尝试将数据整理成如下所示:

var data = [2017, 1, 12, 23, 18, 9];

其中:

  1. 第0列中的年份在所有行中都相同。

  2. 对于每一行,第1列至第5列将只有一个非零元素。

是否有一种简便的方法,而不必通过多个for循环处理数据?我希望也许有一些本机方法可以在Array类型或函数库中找到。

3 个答案:

答案 0 :(得分:1)

遍历数组,并检查数字是否大于当前数字:

var data = [
   [2017,   1,       0,       0,       0,       0],
   [2017,   0,       0,       23,      0,       0],
   [2017,   0,       0,       0,       0,       9],
   [2017,   0,       12,      0,       0,       0],
   [2017,   0,       0,       0,       18,      0]
];

let newdata = [];

for (row of data) {
  for (let i = 0; i<row.length; ++i) {
    newdata[i] = (!newdata[i] || row[i] > newdata[i]) ? row[i] : newdata[i];
  }
}
console.log(newdata);

输出:

[2017, 1, 12, 23, 18, 9]

答案 1 :(得分:1)

在第一行使用Array.map()获取列索引,并将所有行reduce设为该列上的单个非0值:

const data = [
   [2017,   1,       0,       0,       0,       0],
   [2017,   0,       0,       23,      0,       0],
   [2017,   0,       0,       0,       0,       9],
   [2017,   0,       12,      0,       0,       0],
   [2017,   0,       0,       0,       18,      0]
];

const result = data[0]
  .map((_, i) => 
    data.reduce((r, e) => r ? r : e[i], 0)
  );
  
console.log(result);

答案 2 :(得分:0)

实际上,基于以下两个条件:

  1. 第0列中的年份在所有行中都是相同的。
  2. 对于每一行,第1列至第5列将只有一个非零元素。

您可以在inners数组上使用reduce()findIndex()查找索引大于零的大于零的第一个数字,然后将其放在累加结果的相关索引上。这将提高性能,因为您不需要在reduce方法的所有迭代中迭代整个内部数组。

var data = [
   [2017, 1, 0,  0,  0,  0],
   [2017, 0, 0,  23, 0,  0],
   [2017, 0, 0,  0,  0,  9],
   [2017, 0, 12, 0,  0,  0],
   [2017, 0, 0,  0,  18, 0]
];

let res = data.slice(1).reduce((acc, curr) =>
{
    let found = curr.findIndex((n, idx) => n > 0 && idx > 0);
    acc[found] = curr[found];
    return acc;

}, data[0]);

console.log(JSON.stringify(res));