【问题标题】:How can I collapse a multidimensional array into a single array with a common value? [closed]如何将多维数组折叠成具有共同值的单个数组? [关闭]
【发布时间】:2019-01-25 22:29:59
【问题描述】:

已编辑以更清楚地说明我的问题:

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

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 类型或库中的函数中可能有一些本机方法。

【问题讨论】:

  • 如果我还没有尝试解决它,我就不会在这里发布它
  • 太棒了,非常感谢您的提示!

标签: javascript arrays multidimensional-array


【解决方案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]

【讨论】:

    【解决方案2】:

    在第一行使用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);

    【讨论】:

      【解决方案3】:

      其实,基于以下两个条件:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-09
        • 1970-01-01
        • 2016-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多