为什么我不能缩小数组?

时间:2019-11-28 23:33:34

标签: javascript angular typescript loops mapreduce

如果有人能向我解释为什么我要始终获得总额时,我会很高兴,我总是总是遇到类似以下错误:“运算符+不能应用于类型' {数据:字符串,数量:数字}” 或其他任何类型。


const payments = [
      [
        { data: '11/12/19', amount: 1000 },
      ],
      [
        { data: '11/01/20', amount: 1000 },
        { data: '12/01/19', amount: 1000 },
      ],
      [],
      [
        { data: '11/02/20', amount: 1000 },
        { data: '12/02/19', amount: 1000 },
        { data: '12/02/19', amount: 1000 },
      ],
      [],
      [],
      [],
      [],
      [],
      [],
      [],
      [],
    ];

    const acc = new Array(12).fill([]);

    acc.forEach((value, index, arr) => {
      if (payments[index] === undefined) { return []; }
      console.log(payments[index]);
      const total = payments[index].reduce((acc, value) => acc + value.amount)
    });


2 个答案:

答案 0 :(得分:1)

如果不将第二个参数传递给.reduce,则其初始值将是数组中的第一项。但是您的数组项是对象,并且不能用+(数字).amount对对象进行编号。而是给它一个初始值0:

const total = payments[index].reduce((acc, value) => acc + value.amount, 0)

您还应该在acc中创建12个单独的数组,而不是创建一个存在12次的单个数组:

const acc = new Array(12).fill().map(() => []);

否则,更改acc中的任何数组将同时更改所有数组。

答案 1 :(得分:1)

这里的问题是reduce()试图将一个对象和一个数字加在一起,当要减少的数组中有多个对象时。

之所以发生这种情况,是因为没有提供减少的“起始值”。如果未提供任何起始值,则reduce将获取数组的第一项,并累积到该数组的后续项(根据您的减少逻辑),在您的情况下,这将导致以下情况发生:

  

{ data: '11/01/20', amount: 1000 } + 1000 //无效

在您的情况下,可以通过将0作为reduce()的第二个参数(表示总数的起始值)来解决此问题。对您的代码进行以下修订(以及其他简化)可以解决问题:

const payments = [
      [
        { data: '11/12/19', amount: 1000 },
      ],
      [
        { data: '11/01/20', amount: 1000 },
        { data: '12/01/19', amount: 1000 },
      ],
      [],
      [
        { data: '11/02/20', amount: 1000 },
        { data: '12/02/19', amount: 1000 },
        { data: '12/02/19', amount: 1000 },
      ],
      [],
      [],
      [],
      [],
      [],
      [],
      [],
      [],
    ]
    // Transform the payments array to a collection of totals using map
    .map((payment) => {
  
      // Pass 0 as starting value for sum calculation of the current
      // payment array
      return payment.reduce((total, item) => total + item.amount, 0);
    });

console.log(payments);

希望有帮助!