繁体   English   中英

如何根据一个等值的性质得到数组中各种对象的正负值之和?

[英]How to obtain a sum of positive and negative values of various objects in an array based on a property of equal value?

我想帮助解决一个问题:

我有一个包含多个对象的数组,这些对象具有两个属性“日期”和“金额”

对应的“日期”值是 1-12,它们是一年中的月份。

“数量”值对应于所做的移动。 如果添加了一个值,它将是正数,当一个值被撤回时,它将是负数。

“前任:

var payments = [
{"amount": "123.00", "date": "01"},
{"amount": "123.00", "date": "01"},
{"amount": "-23.00", "date": "01"},
{"amount": "-23.00", "date": "01"},
{"amount": "23.00", "date": "01"},
{"amount": "123.00", "date": "02"},
{"amount": "123.00", "date": "02"},
{"amount": "-12.00", "date": "06"},
{"amount": "-10.00", "date": "06"},
{"amount": "-12.00", "date": "07"},
{"amount": "100.00", "date": "08"},
{"amount": "-100.00", "date": "08"},
];

我想从这个数组中获取具有相同“数据”值的所有“数量”的总和,将负数与正数分开。

Ex:

In January[01], was added [123 + 123 + 23] = 269;
and has been withdrawn [- 23 - 23] = - 46;

In February[02] was added [123 + 123] = 246;
and no value was taken;

In August [08] was added [100];
and has been withdrawn [100];

我将使用顶点图表中的数据。

我相信我可以在一年中的每个月使用几个“IF”,是这样还是可以以其他方式完成?

非常感谢您的帮助!

你可以试试:

txn={};

for(payment of payments) {
  var date=payment.date;
  if(txn[date]==undefined) {
    txn[date]={};
    txn[date].added=[];
    txn[date].withdrawn=[];
  }
  var negative=(payment.amount.charAt(0)=="-");
  if(negative) txn[date].withdrawn.push(payment.amount);
  else txn[date].added.push(payment.amount);
}

因此,这不是总和,而是您在预期结果中显示的内容。
在此代码之后,您必须遍历 output 的对象键。

您可以像这样使用两个对象:

 var payments = [ {"amount": "123.00", "date": "01"}, {"amount": "123.00", "date": "01"}, {"amount": "-23.00", "date": "01"}, {"amount": "-23.00", "date": "01"}, {"amount": "23.00", "date": "01"}, {"amount": "123.00", "date": "02"}, {"amount": "123.00", "date": "02"}, {"amount": "-12.00", "date": "06"}, {"amount": "-10.00", "date": "06"}, {"amount": "-12.00", "date": "07"}, {"amount": "100.00", "date": "08"}, {"amount": "-100.00", "date": "08"}, ]; var added = {}; var removed = {}; payments.forEach(p=>{ if(p.amount > 0){ if(+p.date in added){ added[+p.date].push(+p.amount); } else { added[+p.date] = [+p.amount]; } } else { if(+p.date in removed){ removed[+p.date].push(+p.amount); } else { removed[+p.date] = [+p.amount]; } } }); var months = [,"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; var res = document.getElementById("result"); for(let i = 1; i <= 12; i++){ if(i in added){ if(added[i].length > 1){ result.textContent += `In ${months[i]}[${i < 10? '0' + i: i}], added [${added[i].join(' + ')}] = ${added[i].reduce((acc,curr)=>acc+curr,0)}\n`; } else { result.textContent += `In ${months[i]}[${i < 10? '0' + i: i}], added [${added[i][0]}]\n` } if(i in removed){ if(removed[i].length > 1){ result.textContent += `and withdrew [${removed[i].join(' ')}] = ${removed[i].reduce((acc,curr)=>acc+curr,0)}\n`; } else { result.textContent += `and withdrew [${Math.abs(removed[i][0])}]\n`; } } else { result.textContent += "and no value was taken\n"; } } else if(i in removed){ if(removed[i].length > 1){ result.textContent += `In ${months[i]}[${i < 10? '0' + i: i}], withdrew [${removed[i].join(' ')}] = ${removed[i].reduce((acc,curr)=>acc+curr,0)}\n`; } else { result.textContent += `In ${months[i]}[${i < 10? '0' + i: i}], withdrew [${Math.abs(removed[i][0])}]\n`; } } }
 <pre id="result"></pre>

这将使它完全动态:

txn={};
for(var payment of payments) {
if(payment.amount>=0) {
  if(txn[date]['deposit'])
    txn[date]['deposit'] += payment.amount;
  else
    txn[date]['deposit'] = payment.amount;
} else {
  if(txn[date]['withdraw'])
    txn[date]['withdraw'] += payment.amount;
  else
    txn[date]['withdraw'] = payment.amount;
}

console.log(txn);

这样的事情应该做你:

var months = [
  undefined,
  "Jan",
  "Feb",
  "Mar",
  "Apr",
  "May",
  "Jun",
  "Jul",
  "Aug",
  "Sep",
  "Oct",
  "Nov",
  "Dec",
];

var payments = [
    {"amount": "123.00", "date": "01"},
    {"amount": "123.00", "date": "01"},
    {"amount": "-23.00", "date": "01"},
    {"amount": "-23.00", "date": "01"},
    {"amount": "23.00", "date": "01"},
    {"amount": "123.00", "date": "02"},
    {"amount": "123.00", "date": "02"},
    {"amount": "-12.00", "date": "06"},
    {"amount": "-10.00", "date": "06"},
    {"amount": "-12.00", "date": "07"},
    {"amount": "100.00", "date": "08"},
    {"amount": "-100.00", "date": "08"},
    ];

    const summary = payments.reduce( (acc,p) => {
      const date = Number(p.date);
      const amt = Number(p.amount);

      let value = acc.get(date);
      if (!value) {
        value = { date, deposits: [], withdrawals: [], totalDeposits: 0, totalWithdrawals: 0, netChange: 0 };
        acc.set(date, value);
      }

      switch (Math.sign(amt)) {
        case -1:
          value.withdrawals.push(amt);
          value.totalWithdrawals += amt;
          break;
        case +1:
        case  0:
        default:
          value.deposits.push(amt);
          value.totalDeposits += amt;
          break;
      }
      value.netChange += amt;

      return acc;
    }, new Map() );

    for (const x of summary.values()) {
      console.log(`${months[x.date]}[${x.date}]:
  Total Deposits:    ${x.totalDeposits}    : [ ${x.deposits.join(", ")} ]
  Total Withdrawals: ${x.totalWithdrawals} : [ ${x.withdrawals.join(", ")} ]
  Net Changes:       ${x.netChange}
`, )
}

打印这个:

Jan[1]:
  Total Deposits:    269    : [ 123, 123, 23 ]
  Total Withdrawals: -46 : [ -23, -23 ]
  Net Changes:       223

Feb[2]:
  Total Deposits:    246    : [ 123, 123 ]
  Total Withdrawals: 0 : [  ]
  Net Changes:       246

Jun[6]:
  Total Deposits:    0    : [  ]
  Total Withdrawals: -22 : [ -12, -10 ]
  Net Changes:       -22

Jul[7]:
  Total Deposits:    0    : [  ]
  Total Withdrawals: -12 : [ -12 ]
  Net Changes:       -12

Aug[8]:
  Total Deposits:    100    : [ 100 ]
  Total Withdrawals: -100 : [ -100 ]
  Net Changes:       0

对于这种情况,我喜欢减少 function,如下所示:


const payments = [
  {"amount": "123.00", "date": "01"},
  {"amount": "123.00", "date": "01"},
  {"amount": "-23.00", "date": "01"},
  {"amount": "-23.00", "date": "01"},
  {"amount": "23.00", "date": "01"},
  {"amount": "123.00", "date": "02"},
  {"amount": "123.00", "date": "02"},
  {"amount": "-12.00", "date": "06"},
  {"amount": "-10.00", "date": "06"},
  {"amount": "-12.00", "date": "07"},
  {"amount": "100.00", "date": "08"},
  {"amount": "-100.00", "date": "08"},
];

const sum = (data, column, key, value) => 
  data.reduce((total, each) => {
    const number = parseFloat(each[column]);
    if(each[key] === value && number > 0)
      total += number;
    return total;
  }, 0)
;

const sub = (data, column, key, value) => 
  data.reduce((total, each) => {
    const number = parseFloat(each[column]);
    if(each[key] === value && number < 0)
      total += number;
    return total;
  }, 0)
;

console.log(sum(payments, "amount", "date", "01"));
console.log(sub(payments, "amount", "date", "01"));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM