Javascript 在嵌套对象数组中,如何访问上一个对象值并增加一个fileld
我有两个对象数组Javascript 在嵌套对象数组中,如何访问上一个对象值并增加一个fileld,javascript,typescript,Javascript,Typescript,我有两个对象数组 钱包 交易 现在,我在钱包中循环过滤对象,并使用 for (let i in wallets){ temp = tcode.filter(data => data.walletId == wallets[i]._id).sort(((a, b) => { return new Date(b.createdOn) - new Date(a.createdOn) })).map(data=> ({ _id: data._id, credit:d
for (let i in wallets){
temp = tcode.filter(data => data.walletId == wallets[i]._id).sort(((a, b) => { return new Date(b.createdOn) - new Date(a.createdOn) })).map(data=> ({
_id: data._id,
credit:data.type=='Credit'? data.amount:null,
debit:data.type=='Debit'? data.amount:null,
amount:data.amount,
createdOn:data.createdOn,
type:data.type,
walletId:data.walletId,
}))
}
现在我需要在每个新映射的对象中添加期初余额,这是每个对象之前所有金额的总和,使用Simple For loop我可以激活它,但是否有更好的方法使用Reduce和Map来实现这一点
预期结果:
[
{
_id: 6,
credit: null,
debit: 897.46,
amount: 897.46,
createdOn: '2020-01-24T10:33:27.000Z',
type: 'Debit',
walletId: 2,
openingBalance: 897.46
},
{
_id: 3,
credit: 624.22,
debit: null,
amount: 624.22,
createdOn: '2020-01-01T15:21:58.000Z',
type: 'Credit',
walletId: 2,
openingBalance: 1521.68
},
{
_id: 8,
credit: -934.81,
debit: null,
amount: -934.81,
createdOn: '2019-12-06T22:17:35.000Z',
type: 'Credit',
walletId: 2,
openingBalance: 586.87
}
]
您可以首先使用reduce按walletid键对数组进行分组,然后提取这些值/数组并按日期分别对它们进行排序
const钱包=[{
标题:“钱包1”,
_id:“1”,
创建日期:新日期(“2020-07-14T00:00:00.000Z”)
},
{
标题:“钱包2”,
_id:“2”,
创建日期:新日期(“2020-07-13T00:00:00.000Z”)
},
{
标题:“钱包3”,
_id:“3”,
创建日期:新日期(“2020-07-19T00:00:00.000Z”)
}
]
常量代码=[{
“createdOn”:“2020-03-16T11:58:52.000Z”,
“类型”:“信用”,
“_id”:2,
“金额”:212.92,
瓦莱蒂:1
},
{
“createdOn”:“2020-01-01T15:21:58.000Z”,
“类型”:“信用”,
“_id”:3,
“金额”:624.22,
瓦莱蒂:2
},
{
“createdOn”:“2019-12-13T20:50:38.000Z”,
“类型”:“信用”,
“_id”:4,
“金额”:-874.15,
瓦莱蒂:3
},
{
“createdOn”:“2020-05-25T22:37:20.000Z”,
“类型”:“信用”,
“_id”:5,
“金额”:-502.68,
瓦莱蒂:1
},
{
“createdOn”:“2020-01-24T10:33:27.000Z”,
“类型”:“借方”,
“_id”:6,
“金额”:897.46,
瓦莱蒂:2
},
{
“createdOn”:“2019-09-24T00:45:15.000Z”,
“类型”:“借方”,
“_id”:7,
“金额”:981.36,
瓦莱蒂:1
},
{
“createdOn”:“2019-12-06T22:17:35.000Z”,
“类型”:“信用”,
“_id”:8,
“金额”:-934.81,
瓦莱蒂:2
},
{
“createdOn”:“2019-09-06T03:49:31.000Z”,
“类型”:“信用”,
“_id”:9,
“金额”:818.77,
瓦莱蒂:3
},
{
“createdOn”:“2020-04-23T22:09:46.000Z”,
“类型”:“信用”,
“_id”:10,
“金额”:312.33,
瓦莱蒂:3
},
{
“createdOn”:“2020-07-18T09:15:12.000Z”,
“类型”:“信用”,
“_id”:11,
“金额”:-739.77,
瓦莱蒂:1
}
]
const groupedArr=tcode.reduce((acc,x)=>{
const match=wallets.some(y=>y._id.toString()==x.walletId.toString())
const key=x.walletId
如果(!匹配)返回acc;
if(附件[键]){
const lastIndex=acc[key]。长度-1;
acc[键]。推送({…x,
期初余额:acc[key][lastIndex]。期初余额+x.金额
});
}否则{
acc[键]=[{…x,
期初余额:x.金额
}];
}
返回acc;
}, {})
const sortedar=Object.values(groupedArr).map(x=>x.sort)((a,b)=>{
返回新日期(b.createdOn)-新日期(a.createdOn)
})))
console.log(sortedar)
我建议生成一个类似钱包的对象数组,每个对象都有一个事务属性,具有您描述的数组
但是,请注意,openBalance
应按相反的方向汇总,即从较旧的交易到最近的交易
我还将只执行一次排序操作,然后使用映射
收集右侧钱包的交易
列表中的数据
下面是您可以使用的代码。作为奖励,它还注册扩展钱包对象级别的当前余额:
let Wallet=[{title:“Wallet 1”,id:“1”,创建日期:新日期(“2020-07-14T00:00:00.000Z”)},{title:“Wallet 2”,id:“2”,创建日期:新日期(“2020-07-13T00:00:00.000Z”),{title:“Wallet 3”,id:“3”,创建日期:新日期(“2020-07-19T00:00.000Z”)]
让tcode=[{“createdOn”:“2020-03-16T11:58:52.000Z”,“type”:“Credit”;“id”:2,“amount”:212.92,walletId:1},{“createdOn”:“2020-01-01T15:21:58.000Z”,“type”:“Credit”;“id”:3,“amount”:624.22,walletId:2},{“createdOn”:“2019-12-13T20:50:38.000Z”,“type”:“Credit”;“id”:4,“amount”:-874.15,walletId:3,{“2020-05-25T22:37:20.000Z”,“类型:”贷方“,”id“:5,“金额”:-502.68,瓦莱蒂德:1},{”createdOn“,”2020-01-24T10:33:27.000Z”,“类型:”借方“,”id“:6,“金额”:897.46,瓦莱蒂德:2},{”createdOn“,”2019-09-24T00:45:15.000Z”,“类型:”借方“,”id“,”7,“金额”:981.36,瓦莱蒂德:1},“,”createdOn-2019-T20002:”类型:信用证类型:信用证类型:信用证类型:信用证类型:信用证类型:信用证类型:信用证类型:信用证类型:信用证类型:信用证类型:信用证类型:信用证类型:信用证类型:信用证类型:信用证类型:信用证类型:信用证类型:信用证类型:信用证类型:“:-739.77,瓦莱蒂:1}];
//按钱包id输入密码,并为其添加交易列表
let map=new map(wallets.map(wallet=>[+wallet.\u id,({…wallet,{交易:[],openBalance:0}]);
//获取事务的已排序副本
让sorted=[…tcode].sort((a,b)=>a.createdOn.localeCompare(b.createdOn));
//将每笔交易放入相应的钱包列表中
for(让{createdOn,type,_id,amount,walletId}排序){
let wallet=map.get(+walletId);//拿起对应的钱包
//避免浮点误差
wallet.openBalance=+(wallet.openBalance+金额).toFixed(2);
钱包。交易。取消移动({
_身份证,
贷方:类型==“贷方”?金额:空,
借方:类型==“Dedit”?金额:空,
数量
createdOn,
类型,
瓦莱蒂,
openBalance:wallet.openBalance
});
}
//从地图中提取结果
让richWallets=Array.from(map.values());
控制台日志(RichWallet)
这正是reduce
的目的,因为每次迭代
for (let i in wallets){
temp = tcode.filter(data => data.walletId == wallets[i]._id).sort(((a, b) => { return new Date(b.createdOn) - new Date(a.createdOn) })).map(data=> ({
_id: data._id,
credit:data.type=='Credit'? data.amount:null,
debit:data.type=='Debit'? data.amount:null,
amount:data.amount,
createdOn:data.createdOn,
type:data.type,
walletId:data.walletId,
}))
}
[
{
_id: 6,
credit: null,
debit: 897.46,
amount: 897.46,
createdOn: '2020-01-24T10:33:27.000Z',
type: 'Debit',
walletId: 2,
openingBalance: 897.46
},
{
_id: 3,
credit: 624.22,
debit: null,
amount: 624.22,
createdOn: '2020-01-01T15:21:58.000Z',
type: 'Credit',
walletId: 2,
openingBalance: 1521.68
},
{
_id: 8,
credit: -934.81,
debit: null,
amount: -934.81,
createdOn: '2019-12-06T22:17:35.000Z',
type: 'Credit',
walletId: 2,
openingBalance: 586.87
}
]