如果有人能向我解释为什么我要始终获得总额时,我会很高兴,我总是总是遇到类似以下错误:“运算符+不能应用于类型' {数据:字符串,数量:数字}” 或其他任何类型。
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)
});
答案 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);
希望有帮助!