【问题标题】:How can I calculate the sum of values of Plaid API transaction array in Java Script?如何在 Java Script 中计算 Plaid API 事务数组的值的总和?
【发布时间】:2020-04-25 11:19:57
【问题描述】:

对于这个可能很愚蠢的问题,我深表歉意——我对编码/JavaScript 还很陌生。

我正在使用Plaid's 沙盒环境在沙盒环境中提取事务数据。现在,我将以下内容定义为 transactionData:

    let transactionsData = [];
transactions.forEach(function(account) {
  account.transactions.forEach(function(transaction) {
    transactionsData.push({
      account: account.accountName,
      date: transaction.date,
      category: transaction.category[0],
      name: transaction.name,
      amount: transaction.amount
    });
  });
});

我可以像这样成功地在material table 中逐行呈现单个交易:

    const transactionsColumns = [
  { title: "Account", field: "account" },
  { title: "Date", field: "date", type: "date", defaultSort: "desc" },
  { title: "Name", field: "name" },
  { title: "Amount", field: "amount", type: "numeric" },
  { title: "Category", field: "category" }
];

          <MaterialTable
            columns={transactionsColumns}
            data={transactionsData}
            }}

我知道这必须非常简单,但我要做的就是对 transactionsData 求和,然后在我页面的其他地方呈现单个求和值。如果我写 transactionsData.length 我可以很容易地收到交易的数量。我尝试了以下有点相似的语法,但没有发现它可以工作:

array.reduce(function(total, currentValue, currentIndex, arr), initialValue)

任何帮助将不胜感激。

【问题讨论】:

  • 如果您可以提供一些虚拟数据,我将创建一个 sn-p,您可以运行它来验证我的答案中的代码。
  • 嘿 Tex - 非常感谢您的帮助。谢谢你。很抱歉输出不干净 - 我在导出数组时遇到问题 - 但这里有一些示例事务仅供您注意(所有虚拟数据)。花旗 12/31/2019 美国联合航空 500 Travel Huntington Bank 12/31/2019 美国联合航空 500 Travel Navy Federal Credit Union 12/31/2019 美国联合航空 500 Travel Citi 12/29/2019 优步 072515 SFPOOL 6.33 Travel Huntington Bank 12/29/2019 Uber 072515 SFPOOL 6.33 Travel

标签: javascript plaid


【解决方案1】:

这是总数,使用Array.prototype.reduce

const transformed = [{"account":"Navy Federal Credit Union","date":"2020-01-01","category":"Travel","name":"United Airlines","amount":500},{"account":"Navy Federal Credit Union","date":"2019-12-30","category":"Travel","name":"Uber 072515 SF**POOL**","amount":6.33},{"account":"Navy Federal Credit Union","date":"2019-12-27","category":"Food and Drink","name":"Tectra Inc","amount":500}]

const unrounded = transformed.reduce(
  (acc, { amount }) => acc + amount,
  0
);

const roundCents = amount => Math.round(amount * 100) / 100;

const total = roundCents(unrounded);

console.log(total);

上面的一个更简单的版本,没有解构:

const transformed = [{"account":"Navy Federal Credit Union","date":"2020-01-01","category":"Travel","name":"United Airlines","amount":500},{"account":"Navy Federal Credit Union","date":"2019-12-30","category":"Travel","name":"Uber 072515 SF**POOL**","amount":6.33},{"account":"Navy Federal Credit Union","date":"2019-12-27","category":"Food and Drink","name":"Tectra Inc","amount":500}]

const unrounded = transformed.reduce(
  (acc, transaction) => acc + transaction.amount,
  0
);

const roundCents = amount => Math.round(amount * 100) / 100;

const total = roundCents(unrounded);

console.log(total);

下面是如何将transactionsData 转换为Array.prototype.flatMapArray.prototype.map,而不是forEach

const transactionsData = [{ accountName: 'a1', transactions: [{ date: '2020', category: ['c1'], name: 'n1', amount: 100 }, { date: '2020', category: ['c2'], name: 'n2', amount: 100 }]}, { accountName: 'a2', transactions: [{ date: '2020', category: ['c3'], name: 'n3', amount: 100 }, { date: '2020', category: ['c4'], name: 'n4', amount: 100 }]}]

const transformed = transactionsData.flatMap(({ accountName, transactions }) =>
  transactions.map(({ date, category, name, amount }) => ({
      account: accountName,
      date,
      category: category[0],
      name,
      amount
    })
  )
);

console.log(transformed)

再一次,一个更简单的版本,没有解构:

const transactionsData = [{ accountName: 'a1', transactions: [{ date: '2020', category: ['c1'], name: 'n1', amount: 100 }, { date: '2020', category: ['c2'], name: 'n2', amount: 100 }]}, { accountName: 'a2', transactions: [{ date: '2020', category: ['c3'], name: 'n3', amount: 100 }, { date: '2020', category: ['c4'], name: 'n4', amount: 100 }]}]

const transformed = transactionsData.flatMap(account =>
  account.transactions.map(transaction => ({
      account: account.accountName,
      date: transaction.date,
      category: transaction.category[0],
      name: transaction.name,
      amount: transaction.amount
    })
  )
);

console.log(transformed)

Array.prototype.map 是从现有数组创建新数组时使用的正确方法,Array.prototype.flatMap 是在需要扁平数组时使用的正确方法,map 会生成嵌套数组.

【讨论】:

  • 嗨,Tex - 非常感谢这个彻底的回答。我有另一个可能很愚蠢的问题要问您:每当我定义“转换”时(就像您在上面的最后一个代码块中所做的那样),我都会收到此错误:TypeError: Cannot read property 'map' of undefined.关于如何排除故障的任何想法?
  • @wharfchillin 我已经将最后两个代码示例转换为可运行的 sn-ps,方法是添加看起来与您从 Plaid 获得的数据相匹配的虚拟事务数据。两个示例中的代码第一次运行时不需要更改,因此它是有效的,至少考虑到我对输入数据的理解。很难翻译您在之前评论中添加的数据,但如果您可以添加实际数据(console.log(JSON.stringify(transactionsData)) 可能会有所帮助),我将使用您的“实际”虚拟数据更新 sn-ps。
  • 嗨,Tex,这是输出样本(所有虚拟数据)。 [{"account":"Navy Federal Credit Union","date":"2020-01-01","category":"Travel","name":"United Airlines","amount":500},{"account":"Navy Federal Credit Union","date":"2019-12-30","category":"Travel","name":"Uber 072515 SF**POOL**","amount":6.33},{"account":"Navy Federal Credit Union","date":"2019-12-27","category":"Food and Drink","name":"Tectra Inc","amount":500}] 再次感谢您的帮助。
  • 我需要输入数据,以便查看它与我的预期有何不同。
  • 对不起,当我说输出数据时我可能弄错了,我运行了您发送的控制台(console.log(JSON.stringify(transactionsData)),这就是结果的前几行。当您说输入数据时,您指的是不同的东西吗?谢谢你忍受我的无知哈哈。但是为了回到我原来的帖子,我几乎只想获取这个数组并将每笔交易的 "amount:" field 相加并返回总数。
猜你喜欢
  • 1970-01-01
  • 2017-08-21
  • 1970-01-01
  • 1970-01-01
  • 2018-08-05
  • 1970-01-01
  • 2020-09-07
  • 2021-08-04
  • 1970-01-01
相关资源
最近更新 更多