Alterar campos de objeto com dados da matriz
Para cada usuário em minha matriz, quero pegar seu positionTitle se 'isPrimary' estiver definido como true e usar esse positionTitle para substituir todos os positionTitle do mesmo usuário no meu objeto.
Ambos os conjuntos de dados têm 'fullName', que eu acho que deveria ser usado, pois pode haver várias posições, o que me leva a pensar que o positionID não pode ser usado.
O código que tenho substitui os títulos, mas não funciona se um usuário tiver várias posições.
Nota lateral: se não houver posições primárias, gostaria que a primeira posição de um usuário na matriz fosse usada.
O isPrimary no objeto é basicamente irrelevante.
Meu objeto:
graphData = {
"name": "Annual meetings",
"engagementAreas": [{
"id": "1",
"engagementTypes": [{
"name": "forestry",
"engagements": []
},{
"name": "houses",
"engagements": [{
"name": "engagement1",
"members": [{
"id": "e334", "account": {
"id": "123", "fullName": "jim bean"
},
"position": {
"id": "3434",
"positionTitle": "Manager",
"isPrimary": false
}
}]
}]
},{
"name": "landscaping",
"engagements": [{
"name": "engagement1343",
"members": [{
"id": "e334", "account": {
"id": "123", "fullName": "john boer"
},
"position": {
"id": "4545",
"positionTitle": "Managing Director",
"isPrimary": true
}
},{
"id": "5555", "account": {
"id": "123", "fullName": "jim bean"
},
"position": {
"id": "a16b0000004AxeBAAS",
"positionTitle": "Managing Director",
"isPrimary": true
}
}]
}]
}]
},{
"name": "community days",
"engagementTypes": [{
"name": "skyscraping",
"engagements": []
},{
"name": "tennis",
"engagements": [{
"name": "engagement346",
"members": [{
"id": "34", "account": {
"id": "0010X000048DDMsQAO", "fullName": "edy long"
},
"position": {
"id": "3999434",
"positionTitle": "Managing Director",
"isPrimary": true
}
}]
}]
},{
"name": "Juicing",
"engagements": [{
"name": "347343",
"members": [{
"id": "4546", "account": {
"id": "001b000003WnPy1AAF", "fullName": "jeff bint"
},
"position": {
"id": "35006",
"positionTitle": "Senior Manager, Energy"
}
}]
}]
}]
}]
}
Observe que Jim Bean tem duas posições. Minha matriz, cujo isPrimary: true positionTItles que eu quero usar:
IndividualData = [{
"account": {
"id": "23423",
"fullName": "jim bean"
},
"positions": [{
"id": "123",
"organizationId": "001b0000005gxmlAAA",
"organizationName": "a",
"positionTitle": "Dalius Senior Manager, Energy",
"positionLevel": "5-Middle Management & Advisers",
"isPrimary": true,
"startDate": "2016-10-07",
"endDate": null
}]
},{
"account": {
"id": "394838",
"fullName": "jim bean"
},
"positions": [{
"id": "a16b0000004AxeBAAS",
"organizationId": "001b0000005gxmlAAA",
"organizationName": "a",
"positionTitle": "Head Recruiter",
"positionLevel": "Senior Management",
"isPrimary": false,
"startDate": "2008-04-23",
"endDate": null
}]
},{
"account": {
"id": "001b000003WnPy1AAF",
"fullName": "jeff bint"
},
"positions": [{
"id": "a16b0000004AxeBAAS",
"organizationId": "001b0000005gxmlAAA",
"organizationName": "a",
"positionTitle": "Senior Manager, Energy",
"positionLevel": "5-Middle Management & Advisers",
"isPrimary": true,
"startDate": "2016-10-07",
"endDate": null
}]
}, {
"account": {
"id": "0010X000048DDMsQAO",
"fullName": "edy long"
},
"positions": [{
"id": "a160X000004nKfhQAE",
"organizationId": "001b0000005gxmlAAA",
"organizationName": "a",
"positionTitle": "Managing Director",
"positionLevel": "4-Head of Business Unit/Head of Region",
"isPrimary": true,
"startDate": "2018-03-05",
"endDate": null
}]
}, {
"account": {
"id": "123",
"fullName": "john boer"
},
"positions": [{
"id": "325345634634",
"organizationId": "001b0000005gxmlAAA",
"organizationName": "a",
"positionTitle": "Managing Director",
"positionLevel": "4-Head of Business Unit/Head of Region",
"isPrimary": true,
"startDate": "2018-03-05",
"endDate": null
}]
}]
Jim Bean também tem duas posições na matriz acima, mas uma é primária.
meu código que atualmente substitui, mas não pega o primário da matriz e atualiza todos os positionTitles para o mesmo usuário:
const accountIdToPositionDict = IndividualData.reduce( (current, item) => {
current[item.account.id] = (item.positions.filter( position => position.isPrimary )[0] || {} ).positionTitle;
return current;
}, {} );
const updatedGraphTable = { ...graphData,
engagementAreas: graphData.engagementAreas.map(area => ({ ...area,
engagementTypes: area.engagementTypes.map(type => ({ ...type,
engagements: type.engagements.map(engagement => ({ ...engagement,
members: engagement.members.map(member => ({ ...member,
position: { ...member.position,
// use the found positionTitle, or the original one that was given
positionTitle: member.account && accountIdToPositionDict[member.account.id] || member.position.positionTitle
}
}))
}))
}))
}))
};
Minha saída atual:
{
"name": "Annual meetings",
"engagementAreas": [{
"id": "1",
"engagementTypes": [{
"name": "forestry",
"engagements": []
}, {
"name": "houses",
"engagements": [{
"name": "engagement1",
"members": [{
"id": "e334",
"account": {
"id": "123",
"fullName": "jim bean"
},
"position": {
"id": "3434",
"positionTitle": "Managing Director",
"isPrimary": false
}
}]
}]
}, {
"name": "landscaping",
"engagements": [{
"name": "engagement1343",
"members": [{
"id": "e334",
"account": {
"id": "123",
"fullName": "john boer"
},
"position": {
"id": "4545",
"positionTitle": "Managing Director",
"isPrimary": true
}
}, {
"id": "5555",
"account": {
"id": "123",
"fullName": "jim bean"
},
"position": {
"id": "a16b0000004AxeBAAS",
"positionTitle": "Managing Director",
"isPrimary": true
}
}]
}]
}]
}, {
"name": "community days",
"engagementTypes": [{
"name": "skyscraping",
"engagements": []
}, {
"name": "tennis",
"engagements": [{
"name": "engagement346",
"members": [{
"id": "34",
"account": {
"id": "0010X000048DDMsQAO",
"fullName": "edy long"
},
"position": {
"id": "3999434",
"positionTitle": "Managing Director",
"isPrimary": true
}
}]
}]
}, {
"name": "Juicing",
"engagements": [{
"name": "347343",
"members": [{
"id": "4546",
"account": {
"id": "001b000003WnPy1AAF",
"fullName": "jeff bint"
},
"position": {
"id": "35006",
"positionTitle": "Senior Manager, Energy"
}
}]
}]
}]
}]
}
Minha saída esperada. Veja a posição de Jim Bean:
{
"name": "Annual meetings",
"engagementAreas": [{
"id": "1",
"engagementTypes": [{
"name": "forestry",
"engagements": []
}, {
"name": "houses",
"engagements": [{
"name": "engagement1",
"members": [{
"id": "e334",
"account": {
"id": "123",
"fullName": "jim bean"
},
"position": {
"id": "3434",
"positionTitle": "Dalius Senior Manager, Energy",
"isPrimary": false
}
}]
}]
}, {
"name": "landscaping",
"engagements": [{
"name": "engagement1343",
"members": [{
"id": "e334",
"account": {
"id": "123",
"fullName": "john boer"
},
"position": {
"id": "4545",
"positionTitle": "Managing Director",
"isPrimary": true
}
}, {
"id": "5555",
"account": {
"id": "123",
"fullName": "jim bean"
},
"position": {
"id": "a16b0000004AxeBAAS",
"positionTitle": "Dalius Senior Manager, Energy",
"isPrimary": true
}
}]
}]
}]
}, {
"name": "community days",
"engagementTypes": [{
"name": "skyscraping",
"engagements": []
}, {
"name": "tennis",
"engagements": [{
"name": "engagement346",
"members": [{
"id": "34",
"account": {
"id": "0010X000048DDMsQAO",
"fullName": "edy long"
},
"position": {
"id": "3999434",
"positionTitle": "Managing Director",
"isPrimary": true
}
}]
}]
}, {
"name": "Juicing",
"engagements": [{
"name": "347343",
"members": [{
"id": "4546",
"account": {
"id": "001b000003WnPy1AAF",
"fullName": "jeff bint"
},
"position": {
"id": "35006",
"positionTitle": "Senior Manager, Energy"
}
}]
}]
}]
}]
}