Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在嵌套对象数组中,如何访问上一个对象值并增加一个fileld_Javascript_Typescript - Fatal编程技术网

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
      }
    ]