Javascript 减少对对象数组中的贴图和过滤器组合的使用

Javascript 减少对对象数组中的贴图和过滤器组合的使用,javascript,arrays,Javascript,Arrays,将对象数组作为输入,我必须找到并减去与循环中当前项具有相同transactionReference且transactionType等于13的项的TransactionMount字段的数量。在最终结果中,我必须排除transactionType为13的项,并对其余项执行一些自定义操作 给定以下数组: [ { transactionId: 45194, transactionDate: 1579858773136, transactionTyp

将对象数组作为输入,我必须找到并减去与循环中当前项具有相同transactionReference且transactionType等于13的项的TransactionMount字段的数量。在最终结果中,我必须排除transactionType为13的项,并对其余项执行一些自定义操作

给定以下数组:

[
    {
        transactionId: 45194,
        transactionDate: 1579858773136,
        transactionType: 13,
        transactionReference: 82941,
        transactionAmount: 1.21
    },
    {
        transactionId: 45193,
        transactionDate: 1579858773120,
        transactionType: 11,
        transactionReference: 82941,
        transactionAmount: 10
    },
    {
        transactionId: 45192,
        transactionDate: 1579858763947,
        transactionType: 1,
        transactionAmount: 10
    },
    {
        transactionId: 45191,
        transactionDate: 1579858759085,
        transactionType: 131,
        transactionAmount: 2000
    }
]
我提出了以下功能:

transactions => transactions
    .map(({
      transactionId,
      transactionDate,
      transactionType,
      transactionReference,
      transactionAmount
    }) => ({
      transactionId,
      transactionDate,
      transactionType,
      transactionReference,
      transactionAmount: transactionAmount - Number(transactions
        .filter(({
          transactionId: _transactionId,
          transactionReference: _transactionReference,
          transactionType
        }) => transactionType === 13 &&
        _transactionId !== transactionId &&
        transactionReference&&
        _transactionReference === transactionReference
        )
        .map(({ transactionAmount }) => transactionAmount))
    }))
    .filter(({ transactionType }) => transactionType !== 13)
    .map(({
      transactionId,
      transactionAmount,
      transactionDate,
      transactionType
    }) => ({
      id: transactionId,
      amount: Number(transactionAmount).toFixed(2),
      date: moment(transactionDate).format('H:mm'),
      type: transactionType
    }))
我现在想做的是减少map/filter函数的使用,同时保留结果,因为我怀疑我这样做的方式不是最有效的

结果:

[
    {
        id: 45193,
        amount: "8.79",
        date: 1579858773120,
        type: 11
    },
    {

        id: 45192,
        amount: "10.00",
        date: 1579858763947,
        type: 1

    },
    {
        id: 45191,
        amount: "2000.00",
        date: 1579858759085,
        type: 131
    }
]

假设数组是按先有类型13的事务排序的*

只需先建立一个map ref->amount 从输出中放弃类型13的事务 对于其他交易,请从映射中查找要减去的金额或减去0 const transactions=[{transactionId:45194,transactionDate:1579858773136,transactionType:13,transactionReference:82941,TransactionMount:1.21},{transactionId:45193,transactionDate:157985873120,transactionType:11,transactionReference:82941,TransactionMount:10},{transactionId:45192,transactionDate:1579858763947,transactionType:1,TransactionMount:10},{transactionId:45191,transactionDate:1579858759089085,transactionType:131,TransactionMount:2000}] const out=transactions.mapt=>{ //临时性的,只是通过减少变量的冗长来保护你的眼睛 const ref=t.transactionReference 返回Object.assign{ 根:t, 日期:t.transactionDate, 类型:t.transactionType, id:t.transactionId, 金额:t.transactionAmount },ref?{ref}:{} } .reduceout,t=>{ //构建参考文献地图 如果t.type==13{ out.refAmount[t.ref]=t.amount 返回 } const amount=t.amount-out.refAmount[t.ref]| 0 推{ id:t.id, 金额:金额,, 日期:new Datet.date.getTime, 类型:t型 } 返回 },{refAmount:{},without13:[]}。without13
console.logout您能给出一个输出示例吗?我不确定我是否理解生成输出所采取的步骤?为什么您要从第二个金额中减去第一个金额?为什么不反过来?您选择哪一个日期?等等。如果您能澄清这些问题,我将尝试回答您:因此交易类型13类似于因子I n如果它们共享相同的transactionReference值,则需要从任何其他transactionType中减去。这一部分永远不会改变。日期不相关,只是一直向下到结果。我不明白为什么第一个从第二个减去,为什么不是相反?顺序从何而来?只是一个ins我需要遵循的说明。现在我不明白如何用任何其他方式解释它。谢谢你代表我提问。我认为你最初的描述非常清楚,但可能其他人觉得不够清楚,希望你在提出一些答案之前更加详细。。。