![](/img/trans.png)
[英]How to sort an array of objects by property values and sum when this value is equal?
[英]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.