【问题标题】:How to get the sum of two object keys that meet a condition如何获得满足条件的两个对象键的总和
【发布时间】:2021-09-26 22:31:43
【问题描述】:

我有一个 obj,它具有以下键/值

var pay = [
  {
    journal: 23,
    regdate: "31/08/2021",
    account: "2.1.01.0001.02181 Folha de Pagamento:Salarios a Pagar",
    debitvalue: "3003,58",
    creditvalue: "",
    itemdescrip: "Valor ref folha de pgto, mês 08/2021",
    name: "",
    branch: "",
    costcenter: "",
    message: "",
  },
  {
    journal: 23,
    regdate: "31/08/2021",
    account: "2.1.01.0001.02181 Folha de Pagamento:Salarios a Pagar",
    debitvalue: "",
    creditvalue: "4003,58",
    itemdescrip: "Valor ref folha de pgto, mês 08/2021",
    name: "",
    branch: "",
    costcenter: "",
    message: "",
  },
];

我想从“creditvalue”中减去满足条件的所有“debitvalue”,即account key包含2.1.01.0001.02181

我已经尝试过 map、filter、indexOf、contains 并且所有这些都返回 []。

预期结果应该是 3.000 我从javascript开始,我不太了解。谢谢。

【问题讨论】:

  • 您的预期结果应该是什么。请同时添加...
  • @HR01M8055 我已经更新了

标签: javascript multidimensional-array


【解决方案1】:

这样的事情会起作用。

let diff

pay.forEach((obj) => {
  if (obj.account.includes('2.1.01.0001.02181')) {
    let credit = parseInt(obj['creditvalue'].replace(/,/g, '.')) || 0
    let debit = parseInt(obj['debitvalue'].replace(/,/g, '.')) || 0

    diff = credit - debit
  }
})

console.log(diff)

我加入了一些正则表达式来处理您数据中的逗号。

【讨论】:

  • 谢谢!什么| | 0 做吗?
  • 不客气! || 0 表示“或零”,如果 parseInt() 失败(例如您的数据中的值为 ""),它会将 NaN(JS 表示非数字)转换为零。
  • 谢谢!使用您的 RegExp 解决方案和第一个答案,我能够让它工作!我不知道为什么,但是您上面带有更新值的代码返回 4,003.58
  • 我不知道在声明时我可以使用条件,谢谢分享你的知识!
【解决方案2】:

你可以用简单的数组函数来做,比如 .reduce

var pay = [
  {
    journal: 23,
    regdate: "31/08/2021",
    account: "4.1.01.0001.04200 Despesas com folha de pagamento:Salarios",
    debitvalue: "4003.58",
    creditvalue: "",
    itemdescrip: "Valor ref folha de pgto, mês 08/2021",
    name: "",
    branch: "",
    costcenter: "",
    message: "",
  },
  {
    journal: 23,
    regdate: "31/08/2021",
    account: "2.1.01.0001.02181 Folha de Pagamento:Salarios a Pagar",
    debitvalue: "",
    creditvalue: "4003.58",
    itemdescrip: "Valor ref folha de pgto, mês 08/2021",
    name: "",
    branch: "",
    costcenter: "",
    message: "",
  },
];

const totalAmount = pay.reduce( (total, currentPay) => {
    
    if (currentPay.account.includes("2.1.01.0001.02181")) {
        total = total + +currentPay.creditvalue - currentPay.debitvalue;
    }
    return total;
  }, 0)

console.log(totalAmount);

【讨论】:

  • 谢谢!考虑到您的函数和下面的解析浮点数,如果可能的话,我应该如何在一行中实现它。这个总计 = 总计 + +parseFloat(currentPay.creditvalue.replace(/,/g, '.')) - parseFloat(currentPay.debitvalue.replace(/,/g, '.'));返回 NaN
  • 您所做的是正确的,但是您需要检查借方值和贷方值是否为 !== ''" 因为 parseFloat("") 是 NaN,因此您必须添加验证。
【解决方案3】:

为了实现我的需求,我使用了小伙子的协作来实现以下代码

const totalAmount = pay.reduce( (total, currentPay) => {
    
      if (currentPay.account.includes('2.1.01.0001.02181')) {
          var d = parseFloat(currentPay.debitvalue.replace(/,/g, '.')) || 0;
          var c = parseFloat(currentPay.creditvalue.replace(/,/g, '.')) || 0;

          total += +c - d;
      }
      return total;
      }, 0)

谢谢大家!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-16
    • 1970-01-01
    • 2019-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多