如何从对象数组中获取事务的总和



我试图返回所有事务的总和,但程序没有返回的总和

问题

定义一个函数totalTransactions,它接受一个称为transactions的对象数组。

totalTransactions应返回在所有交易中花费的总金额。

我的代码

function totalTransactions(transactions) {
let sum = 0
for (key in transactions) {
transactions[key] += sum;
}
return sum;
}

给定信息这是一个嵌套的数据结构。类似于2D数组,我们可以使用括号和点符号的组合来访问嵌套键值对

例如,为了访问第一个名称和金额值,我们可以使用索引0(对于第一个列表项(,然后是各个键值:

给定示例代码

let transactions = [
{
name: "Tons of glitter",
amount: 70
},
{
name: "Porcelain Pink Flamingos",
amount: 92
},
{
name: "Chandelier replacement",
amount: 10000,
},
{
name: "Dinner at TGIF x6",
amount: 350
}
];
lastFridayNight(transactions) // => 10512

由于您正在计算聚合,reduce在这里是您的朋友。

从等于数字0的sum开始。在每个中间步骤,将当前事务的amount添加到聚合中。

let transactions = [
{
name: "Tons of glitter",
amount: 70
},
{
name: "Porcelain Pink Flamingos",
amount: 92
},
{
name: "Chandelier replacement",
amount: 10000,
},
{
name: "Dinner at TGIF x6",
amount: 350
}
];
function totalTransactions(transactions) {
return transactions.reduce((sum, tx) => sum + tx.amount, 0);
}
console.log(totalTransactions(transactions));

编辑

我喜欢上面片段的工作方式,如果这是我的项目,我可能会走这条路。然而,如果这里的目标是以最简单的方式修复代码,那么这里有一个替代解决方案。

function totalTransactions(transactions) {
let sum = 0
for (const tx of transactions) {
sum += tx.amount;
}
return sum;
}

这里有两个主要变化:

  1. 将循环从for .. in更改为for .. of会迭代事务,而不是数组中的键
  2. 这条线transactions[key] += sum;没有多大意义。您正在将sum的值(在本例中始终为0(添加到对象中。我的测试表明,它将两个值强制转换为字符串,并将它们连接起来。这绝对不是你想要的!相反,您希望从每个事务中获得值amount,并将其添加到sum

为了帮助理解,您的数据是一个对象数组。因此,我们可以使用索引表示法来遍历每个对象,但随后我们使用点表示法来访问该对象的属性的值。

"对于每个";是Array对象的一个函数,它是对"的一个很好的简写;对于(设i=0,i++,i<t.length({t[i]在这里执行代码}";

您可以通过以下几种方式访问对象的属性:https://dmitripavlutin.com/access-object-properties-javascript/

因此,我们正在迭代每个";项目";并访问"amount"属性,将其添加到函数范围(通过let(的变量"中;sum";然后返回该值。

function totalTransactions(t) {
let sum = 0;
t.forEach(item => {
sum += item.amount;
})
return sum;
}

访问属性的另一种方法,类似于数组的表示法:

function totalTransactions(t) {
let sum = 0;
t.forEach(item => {
sum += item['amount'];
})
return sum;
}

如果在数组上使用for..in,请尝试for..of。我可以看到一个将用作totalTransactions参数的示例数组吗?此外,我相信你应该像sum += transactions[key];这样切换重新分配,这样sum就被重新分配了,而不是对象。

最新更新