如何解决如何基于对象数组中的相似值而非属性对对象数组执行加/减运算
我有一个这样的对象数组:
i / p:
let payments=[
{from:"b",to:"c",amount:30},{from:"a",{from:"c",to:"a",amount:50},{from:"b",to:"b",amount:66.66},amount:150},amount:75},amount:125}
]
现在我想基于相同的属性值对数量属性执行求和运算,并基于对属性值进行反向运算以对匹配的属性值(i,e from,to)进行反向匹配,将数组简化为:
o / p:
[
{ from: "b",to: "c",amount: 238.34 },//(sum of all b->c amounts) minus (sum of all c->b amounts)
{ from: "a",amount: 205 },//(sum of all a->c amounts) minus (sum of all c-a amounts)
{ from: "a",to: "b",amount: 16.66 },//(sum of all a->b amounts) minus (sum of all b->a amounts)
];
注意:结果数组数量属性不应为负
我尝试了几种方法,但无法实现。任何帮助,将不胜感激。谢谢
解决方法
也许这会有所帮助:
let payments=[
{from:"b",to:"c",amount:30},{from:"a",{from:"c",to:"a",amount:50},{from:"b",to:"b",amount:66.66},amount:150},amount:75},amount:125}
];
let pay = Object.entries(
payments.reduce((tot,{from,to,amount})=>{
let u=from+'-'+to; // from-to-relationship (in alphabetical order)
if (to<from) { u=to+'-'+from; amount=-amount }
tot[u]=(tot[u]||0)+amount; // collate all payments here
return tot;
},{})
).map(([u,a])=>{let ft=u.split('-');
if (a<0) {ft=ft.reverse();a=-a}
return {from:ft[0],to:ft[1],amount:a.toFixed(2)}
})
console.log(pay)
在.reduce
函数中,我将两个伙伴之间的所有付款整理到一个以“ from-to”命名的“ acounts”帐户对象中,该名称始终按字母顺序建立,因此,如果遇到付款{ {1}}我调换订单并使金额为负:
{from:"b",amount:123}
完成此操作后,我将使用if (to<from) { u=to+'-'+from; amount=-amount }
浏览account对象。这将使我能够再次将帐户名分为Object.entries
和from
合作伙伴。这次我检查合作伙伴之间的应付金额是否为负。如果是这样,我交换伙伴(to
)的顺序,然后将amonut(ft
)乘以-1:
a
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。