简体   繁体   中英

array.push not working inside forEach loop

Here is my code:

let purchasesInfoArray = []

console.log('buyersInfo', buyersInfo)

buyersInfo.forEach((runner) => {
  console.log('runner', runner)

  let purchaseInfo = allPurchase
  let purchaseFunction = {}

  counter = counter + 1;

  console.log('counter é:', counter)

  delete purchaseInfo.friends
  purchaseInfo.priceCents = runner.price
  purchaseInfo.totalTaxPaid = 600
  purchaseInfo.iuguTaxPaid = 198
  purchaseInfo.kmaisTaxPaid = 402
  purchaseInfo.status = 'paid'
  purchaseInfo.runnerCpf = runner.runnerCpf
  purchaseInfo.modality = runner.modality
  purchaseInfo.sex = runner.sex
  purchaseInfo.age = runner.age
  purchaseInfo.birth = runner.birth
  purchaseInfo.buyerName = runner.buyerName

  console.log('número de corredor é:', (oldCounter + counter))

  purchaseInfo.runnerNumber = (oldCounter + counter)
  purchasesInfoArray.push(purchaseInfo)

  console.log('purchase info:', purchaseInfo)
})

console.log(purchasesInfoArray)

Why my purchasesInfoArray is just populating with the last value??

My buyersInfo are:

[{ age: 25,
   birth: '15/07/1994',
   buyerName: 'Romário 2',
   kit: 'Básico',
   modality: 'Caminhada',
   price: 60,
   runnerCpf: '012.499.862-32',
   sex: 'man' },
 { age: 25,
   birth: '14/07/1994',
   buyerName: 'Romário 1',
   kit: 'Básico',
   modality: '5 KM',
   price: 60,
   runnerCpf: '012.499.862-30',
   sex: 'man' }]

My purchasesInfoArray is returning two objects with the last object from array.

I would change your code to

let purchasesInfoArray = []
console.log('buyersInfo', buyersInfo)
buyersInfo.forEach((runner) => {
    console.log('runner', runner)
    let purchaseInfo = {...allPurchase} // <-- This line
    let purchaseFunction = {}
    counter = counter + 1;
    console.log('counter é:', counter)
    delete purchaseInfo.friends
    purchaseInfo.priceCents = runner.price
    purchaseInfo.totalTaxPaid = 600
    purchaseInfo.iuguTaxPaid = 198
    purchaseInfo.kmaisTaxPaid = 402
    purchaseInfo.status = 'paid'
    purchaseInfo.runnerCpf = runner.runnerCpf
    purchaseInfo.modality = runner.modality
    purchaseInfo.sex = runner.sex
    purchaseInfo.age = runner.age
    purchaseInfo.birth = runner.birth
    purchaseInfo.buyerName = runner.buyerName
    console.log('número de corredor é:', (oldCounter + counter))
    purchaseInfo.runnerNumber = (oldCounter + counter)
    purchasesInfoArray.push(purchaseInfo)
    console.log('purchase info:', purchaseInfo)
})

To make sure every purchaseInfo is a new reference, otherwise you are just updating allPurchase with every assignment, thus updating every purchaseInfo as they are all sharing the same memory reference.

If you can't use the spread operator because of your javascript version, you can alternatively use the assign method

let purchaseInfo = Object.assign({}, allPurchase);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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