Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/417.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么我不能减少数组?_Javascript_Angular_Typescript_Loops_Mapreduce - Fatal编程技术网

Javascript 为什么我不能减少数组?

Javascript 为什么我不能减少数组?,javascript,angular,typescript,loops,mapreduce,Javascript,Angular,Typescript,Loops,Mapreduce,如果有人能向我解释为什么当我想得到一个金额的总和时,我总是会得到一个错误,比如:“运算符+不能应用于类型“{data:string,amount:number}”或任何其他类型 const payments = [ [ { data: '11/12/19', amount: 1000 }, ], [ { data: '11/01/20', amount: 1000 }, { data: '12/01/19',

如果有人能向我解释为什么当我想得到一个金额的总和时,我总是会得到一个错误,比如:“运算符+不能应用于类型“{data:string,amount:number}”或任何其他类型


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



如果不将第二个参数传递给
.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
中的任何数组都将更改所有数组。

如果不将第二个参数传递给
.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
中的任何数组都会更改所有数组。

这里的问题是
reduce()
试图将一个对象和一个数字相加,而被缩减的数组中有多个对象

发生这种情况是因为没有提供还原的“起始值”。当没有提供起始值时,还原将获取数组的第一项,并将后续项累积到该项(基于还原逻辑),这在您的情况下会导致类似的情况发生:

{数据:'11/01/20',金额:1000}+1000
//无效

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

const付款=[
[
{数据:'11/12/19',金额:1000},
],
[
{数据:'11/01/20',金额:1000},
{数据:'12/01/19',金额:1000},
],
[],
[
{数据:'11/02/20',金额:1000},
{数据:'12/02/19',金额:1000},
{数据:'12/02/19',金额:1000},
],
[],
[],
[],
[],
[],
[],
[],
[],
]
//使用map将付款数组转换为总计集合
.map((付款)=>{
//传递0作为电流总和计算的起始值
//支付阵列
退货付款.减少((合计,项目)=>合计+项目金额,0);
});

console.log(payments);
这里的问题是
reduce()
试图将一个对象和一个数字相加,而被缩减的数组中有多个对象

发生这种情况是因为没有提供还原的“起始值”。当没有提供起始值时,还原将获取数组的第一项,并将后续项累积到该项(基于还原逻辑),这在您的情况下会导致类似的情况发生:

{数据:'11/01/20',金额:1000}+1000
//无效

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

const付款=[
[
{数据:'11/12/19',金额:1000},
],
[
{数据:'11/01/20',金额:1000},
{数据:'12/01/19',金额:1000},
],
[],
[
{数据:'11/02/20',金额:1000},
{数据:'12/02/19',金额:1000},
{数据:'12/02/19',金额:1000},
],
[],
[],
[],
[],
[],
[],
[],
[],
]
//使用map将付款数组转换为总计集合
.map((付款)=>{
//传递0作为电流总和计算的起始值
//支付阵列
退货付款.减少((合计,项目)=>合计+项目金额,0);
});

console.log(payments);
很有帮助!非常感谢!非常感谢!非常感谢!非常感谢!非常感谢!非常感谢!非常感谢!