如何根据需求将嵌套的数组项处理并组合成一个新的结构?

How does one process and combine nested array items into a new structure based on requirements?

我正在尝试对数组的索引求和并将它们保存到一个新数组中。

我在下面包含了一个示例数组,以及我第一次尝试解决这个问题:

var data = [
  ["29.01.2020", 40, 10],
  ["30.01.2020", 80, 100],
  ["31.01.2020", 90, 500],
  ["01.02.2020", 30, 205],
  ["02.02.2020", 10, 74],
  ["03.02.2020", 30, 120]
];

我尝试创建的结果类似于这些(数组或对象):

[['0120', 210, 610], ['0220', 70, 399]]

{
  "0120": {
    "abc": 210,
    "def": 610
  },
  "0220": {
    "abc": 70,
    "def": 399
  }
}

这是我发现并正在尝试的东西,也许可以通过一些编辑来实现:

var res = {};
data.forEach((item)=>{
  if(Object.keys(res).includes(item[0])){
    res[item[1]] += item[1];
  } else {
    res[item[0]] = item[1];
  }   
}); 

我猜应该可以通过使用子字符串来缩短我的数据数组的第一个索引?我主要努力的是让它总结索引。

有什么办法可以到达那里吗? 提前致谢

首先,您可以使用String.split函数从每个子数组的第一个元素中获取键。使用split函数,可以提取月份和年份字符串并组合生成每个数组的key

并基于该密钥,使用 Array.prototype.reduce,您可以生成您想要的内容。

const data = [
  ["29.01.2020", 40, 10],
  ["30.01.2020", 80, 100],
  ["31.01.2020", 90, 500],
  ["01.02.2020", 30, 205],
  ["02.02.2020", 10, 74],
  ["03.02.2020", 30, 120]
];

const result = data.reduce((acc, cur) => {
  const dateArr = cur[0].split('.');
  const key = dateArr[1] + dateArr[2].slice(-2);
  if (acc[key]) {
    acc[key].abc += cur[1];
    acc[key].def += cur[2];
  } else {
    acc[key] = {
      abc: cur[1],
      def: cur[2]
    };
  }
  return acc;
}, {});

console.log(result);

您可以使用array reduce方法。按点拆分日期字符串。然后将其设为密钥(根据您的要求,月份中的两位数和年份中的最后两位数)并根据该密钥计算它。最后使用Object.values输出数组。

const data = [
  ['29.01.2020', 40, 10],
  ['30.01.2020', 80, 100],
  ['31.01.2020', 90, 500],
  ['01.02.2020', 30, 205],
  ['02.02.2020', 10, 74],
  ['03.02.2020', 30, 120],
];

const ret = data.reduce((prev, c) => {
  const p = prev;
  const date = c[0].split('.');
  const key = `${date[1]}${date[2].slice(-2)}`;
  if (!p[key]) p[key] = [key, c[1], c[2]];
  else p[key] = [key, p[key][1] + c[1], p[key][2] + c[2]];
  return p;
}, {});

console.log(Object.values(ret));