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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.