Cambiar campos de objeto con datos de matriz

Para cada usuario en mi matriz, quiero tomar su positionTitle si 'isPrimary' está establecido en true y usar positionTitle para reemplazar todos los positionTitle del mismo usuario en mi objeto.

mbos conjuntos de datos tienen 'fullName', que creo que debería usarse, ya que puede haber múltiples posiciones, lo que me lleva a pensar que el positionID no se puede usar.

El código que tengo reemplaza los títulos, pero no funciona si un usuario tiene varias posiciones.

Nota lateral: si no hay posiciones principales, me gustaría que se use la primera posición para un usuario en la matriz.

The isPrimary en el objeto es básicamente irrelevante.

Mi 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"

          }
        }]
      }]
    }]
  }]
}

Notice Jim bean tiene dos posiciones. Mi matriz, cuyo isPrimary: true positionTItles que quiero 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 también tiene dos posiciones en la matriz anterior, pero una es primaria.

my código que actualmente reemplaza pero no toma el primario de la matriz y actualiza todos los PositionTitles para el mismo usuario:

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

Mi salida actual:

{
  "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"
          }
        }]
      }]
    }]
  }]
}

Mi salida esperada. mira la posición de Jim Bean Títulos :

{
  "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"
          }
        }]
      }]
    }]
  }]
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta