Javascript 为什么我不能减少数组?
如果有人能向我解释为什么当我想得到一个金额的总和时,我总是会得到一个错误,比如:“运算符+不能应用于类型“{data:string,amount:number}”或任何其他类型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',
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);
很有帮助!非常感谢!非常感谢!非常感谢!非常感谢!非常感谢!非常感谢!非常感谢!