0

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.

2 Answers 2

2

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);

Sign up to request clarification or add additional context in comments.

Comments

1

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
}, {})

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.