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.