简体   繁体   English

从对象数组中减去值

[英]Subtract values from array of objects

I need to subtract total amount - paid amount which is available.scheduleBudget - paidAmount.paid我需要减去可用的总金额 - 已付金额。scheduleBudget -paidAmount.paid

const available = [
  { scheduleBudget: 21600, schudule_number: "11020" },
  { scheduleBudget: 1598000, schudule_number: "11010" },
];

const paidAmount = [
  { paid: 88488, schudule_number: "11010" },
  { paid: 7140, schudule_number: "11020" },
];

Expected output:预期 output:

[
  { balance: 1509512, schudule_number: "11010" },
  { balance: 14460, schudule_number: "11020" },
];

code to get output获取 output 的代码

Object.values(available).forEach((key) => {
  console.log(key);
});

One way to do this is to generate a new object from paidAmount where schudule_number is the key and paid the value.一种方法是从paidAmount生成一个新的 object,其中schudule_number是键并paid了值。 Then you can simply map available to subtract the appropriate paid amount from scheduleBudget :然后,您available简单地mapscheduleBudget中减去适当的paid金额:

 const available = [ { scheduleBudget: 21600, schudule_number: "11020" }, { scheduleBudget: 1598000, schudule_number: "11010" }, ]; const paidAmount = [ { paid: 88488, schudule_number: "11010" }, { paid: 7140, schudule_number: "11020" }, ]; const pA = {}; paidAmount.forEach(p => pA[p.schudule_number] = p.paid); const result = available.map(({scheduleBudget, schudule_number}) => ({ scheduleBudget: scheduleBudget-pA[schudule_number], schudule_number}) ); console.log(result);

You could take an object for the balances groupd by schedule_number and get the result from the object.您可以将 object 用于按schedule_number分组的余额,并从 object 中获取结果。

This approach allows more than one payment for a schedule_number .这种方法允许对schedule_number进行多次付款。

 const available = [{ scheduleBudget: 21600, schedule_number: "11020" }, { scheduleBudget: 1598000, schedule_number: "11010" }], paidAmount = [{ paid: 88488, schedule_number: "11010" }, { paid: 7140, schedule_number: "11020" }], balances = Object.fromEntries(available.map(({ scheduleBudget, schedule_number }) => [schedule_number, scheduleBudget] )); paidAmount.forEach(({ paid, schedule_number }) => balanceses[schedule_number] -= paid); const result = Object.entries(balances).map(([schedule_number, balance]) => ({ balance, schedule_number })); console.log(result);

So you do this to get the answer:所以你这样做是为了得到答案:

const available = [
  { scheduleBudget: 21600, schudule_number: '11020' },
  { scheduleBudget: 1598000, schudule_number: '11010' },
]

const paidAmount = [
  { paid: 88488, schudule_number: '11010' },
  { paid: 7140, schudule_number: '11020' },
]

let finalAvailable = []
available.forEach((value) => {
  paidAmount.forEach((item) => {
    if (value.schudule_number === item.schudule_number) {
      scheduleBudget = value.scheduleBudget - item.paid
      finalAvailable.push({ scheduleBudget, schudule_number: item.schudule_number })
    }
  })
  return finalAvailable
})

console.log('finalAvailable:', finalAvailable)

 const available = [ { scheduleBudget: 21600, schudule_number: '11020' }, { scheduleBudget: 1598000, schudule_number: '11010' }, ] const paidAmount = [ { paid: 88488, schudule_number: '11010' }, { paid: 7140, schudule_number: '11020' }, ] let finalAvailable = [] available.forEach((value) => { paidAmount.forEach((item) => { if (value.schudule_number === item.schudule_number) { scheduleBudget = value.scheduleBudget - item.paid finalAvailable.push({ scheduleBudget, schudule_number: item.schudule_number }) } }) return finalAvailable }) console.log('finalAvailable:', finalAvailable)

If you want use forEach you need to create a third object and forEach both object and substract the value when ticket fit together如果要使用forEach ,则需要创建第三个 object 和forEach两者 object 并在票证合在一起时减去值

 const available = [{scheduleBudget: 21600, schudule_number: '11020'}, {scheduleBudget: 1598000, schudule_number: '11010'}]; const paidAmount = [{paid: 88488, schudule_number: '11010'}, {paid: 7140, schudule_number: '11020'}]; let newOutput = []; Object.values(available).forEach(keyavailable => { Object.values(paidAmount).forEach(keypaidAmount => { if (keyavailable.schudule_number === keypaidAmount.schudule_number) { let sub = keyavailable.scheduleBudget - keypaidAmount.paid; let data = {'balance': sub, 'schudule_number': keypaidAmount.schudule_number}; newOutput.push(data); } }) }) console.log(newOutput);

Assuming the order in available and paidAmount arrays not must match the schulude_number :假设availablepaidAmount arrays 中的订单必须与schulude_number不匹配:

 const available = [ { scheduleBudget: 21600, schudule_number: '11020' }, { scheduleBudget: 1598000, schudule_number: '11010' } ]; const paidAmount = [ { paid: 88488, schudule_number: '11010' }, { paid: 7140, schudule_number: '11020' } ]; function pay(budgets, paid) { const budgetObj = budgets.reduce((a,b) => { a[b.schudule_number] = {balance:b.scheduleBudget, schudule_number:b.schudule_number}; return a; },{}); paid.forEach(p => budgetObj[p.schudule_number].balance -= p.paid); return Object.values(budgetObj); } console.log(pay(available, paidAmount));

If both of available and paidAmount have items that share a schudule_number within their respective lists then perhaps something like this would work:如果availablepaidAmount在各自的列表中都有共享 schudule_number 的项目,那么也许这样的事情会起作用:

 const available = [{ scheduleBudget: 21600, schudule_number: "11020" }, { scheduleBudget: 1598000, schudule_number: "11010" }]; const paidAmount = [{ paid: 88488, schudule_number: "11010" }, { paid: 7140, schudule_number: "11020" }]; const balances = [...available, ...paidAmount].reduce( (acc, item) => Object.assign( acc, { [item.schudule_number]: (acc[item.schudule_number] || 0) + (item.scheduleBudget || 0) - (item.paid || 0) } ), {} ); const result = Object.entries(balances).map( ([schudule_number, balance]) => ({ schudule_number, balance }) ); console.log(result);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM