简体   繁体   中英

React looping and creating new array with nested objects

I have an array of documents:

    [{
      "name": "AAPL",
      "ownerTotals": {uid: "xxx", totaledAmount: 140 }, {uid: "yyy", totaledAmount: 10}
    },
    {
      "name": "TSLA",
      "ownerTotals": {uid: "xxx", totaledAmount: 11 }, {uid: "yyy", totaledAmount: 2}
    }]

and an array of owners:

{uid: "xxx"}, {uid: "yyy"}

I'm trying to create a new/(update) the owners object with a nested object that contains the positions they own. so I want to update owners to this format:

    [{uid: "xxx", "positions": [{name: "AAPL", totaledAmount: 140 },{name: "TSLA", totaledAmount: 11}] },
    {uid: "yyy", "positions": [{name: "AAPL", totaledAmount: 10 },{name: "TSLA", totaledAmount: 2}] }]

what's the best way to achieve this?

I was trying for something along the lines of

owners.forEach((owner) => {
        documents.forEach((document) => {
           document.ownerTotals.forEach((ownerTotal) => {
                if (ownerTotal.uid === owner.uid) {

                 }
             }
        })
     }
})

Not really sure what to do at the heart of each loop, and not even sure if ForEach is the most method way for this...I'm using modern react with hooks.

You can do something like this:

 const documents = [ { name: "AAPL", ownerTotals: [ { uid: "xxx", totaledAmount: 140 }, { uid: "yyy", totaledAmount: 10 } ] }, { name: "TSLA", ownerTotals: [ { uid: "xxx", totaledAmount: 11 }, { uid: "yyy", totaledAmount: 2 } ] } ]; const owners = [{ uid: "xxx" }, { uid: "yyy" }]; const res = owners.map(({ uid }) => { let ownedDocuments = []; documents.forEach((doc) => { let docFound = doc.ownerTotals.find(({ uid: docUid }) => docUid === uid); if (docFound) { ownedDocuments.push({ name: doc.name, totaledAmount: docFound.totaledAmount }); } }); return { uid, positions: ownedDocuments }; }); console.log(res);

You can use reduce to group positions by userid .

const positions =  [{
      "name": "AAPL",
      "ownerTotals": {uid: "xxx", totaledAmount: 140 }, {uid: "yyy", totaledAmount: 10}
    },
    {
      "name": "TSLA",
      "ownerTotals": {uid: "xxx", totaledAmount: 11 }, {uid: "yyy", totaledAmount: 2}
    }]

const posByUid = positions.reduce((acc, current) => {
 const name = current.name
 current.positions.forEach(position => {
   if (!acc[position.uid]) {
    acc[position.uid] = []
   }

   acc[position.uid] = {name, totaledAmount: position.totaledAmount}
 })
 return acc
}, {})

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