Javascript 要使用数组中的值更新的对象数据
我正在尝试用我的individualData数组的“positionTitle”字段更新graphData对象的“positionTitle”字段 我需要准确地做到这一点,两组数据都有“帐户”,它们都有相同的用户id和全名,我希望尝试使用它来进行匹配 我希望来自具有相同帐户id或名称(以较容易的为准)的用户的positionTitle进入对象字段 这就是我目前拥有的: 我的对象(我要更新的对象): 我要获取其位置标题的数组:Javascript 要使用数组中的值更新的对象数据,javascript,arrays,object,Javascript,Arrays,Object,我正在尝试用我的individualData数组的“positionTitle”字段更新graphData对象的“positionTitle”字段 我需要准确地做到这一点,两组数据都有“帐户”,它们都有相同的用户id和全名,我希望尝试使用它来进行匹配 我希望来自具有相同帐户id或名称(以较容易的为准)的用户的positionTitle进入对象字段 这就是我目前拥有的: 我的对象(我要更新的对象): 我要获取其位置标题的数组: IndividualData = [{ "account": {
IndividualData = [{
"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
}]
}
]
我当前使用的函数,它使用数组的第一个positiontitle字段:
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,
positionTitle: IndividualData[0].positions[0].positionTitle
}
}))
}))}))
}))
};
console.log(updatedGraphTable)
console.log('a' + JSON.stringify(updatedGraphTable))
我对职位更新的预期结果:
updatedGraphData = {
"name": "Annual meetings",
"engagementAreas": [{
"id": "1",
"engagementTypes": [{
"name": "forestry",
"engagements": []
},
{
"name": "houses",
"engagements": [{
"name": "engagement1",
"members": [{
"id": "e334", "account": {
"id": "eefe", "fullName": "jim bean"
},
"position": {
"id": "3434",
"positionTitle": "Manager"
}
}]
}]
},
{
"name": "landscaping",
"engagements": [{
"name": "engagement1343",
"members": [{
"id": "e334", "account": {
"id": "123", "fullName": "john boer"
},
"position": {
"id": "4545",
"positionTitle": "Managing Director"
}
}]
}]
}
]
},
{
"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"
}
}]
}]
},
{
"name": "Juicing",
"engagements": [{
"name": "347343",
"members": [{
"id": "4546", "account": {
"id": "001b000003WnPy1AAF", "fullName": "jeff bint"
},
"position": {
"id": "35006",
"positionTitle": "Senior Manager, Energy"
}
}]
}]
}]
}]
}
我目前的结果是:
{
"name": "Annual meetings",
"engagementAreas": [{
"id": "1",
"engagementTypes": [{
"name": "forestry",
"engagements": []
}, {
"name": "houses",
"engagements": [{
"name": "engagement1",
"members": [{
"id": "e334",
"account": {
"id": "eefe"
},
"position": {
"id": "3434",
"positionTitle": "Senior Manager, Energy"
}
}]
}]
}, {
"name": "landscaping",
"engagements": [{
"name": "engagement1343",
"members": [{
"position": {
"id": "4545",
"positionTitle": "Senior Manager, Energy"
}
}]
}]
}]
}, {
"name": "community days",
"engagementTypes": [{
"name": "skyscraping",
"engagements": []
}, {
"name": "tennis",
"engagements": [{
"name": "engagement346",
"members": [{
"id": "34",
"account": {
"id": "3546"
},
"position": {
"id": "3999434",
"positionTitle": "Senior Manager, Energy"
}
}]
}]
}, {
"name": "Juicing",
"engagements": [{
"name": "347343",
"members": [{
"id": "4546",
"account": {
"id": "3545"
},
"position": {
"id": "35006",
"positionTitle": "Senior Manager, Energy"
}
}]
}]
}]
}]
}请尝试下面的代码
accountPositions = {};
IndividualData.forEach((data) => {
accountPositions[data.account.id] = data.positions.filter((pos) => {return pos.isPrimary})[0].positionTitle;
});
graphData.engagementAreas.forEach((area) => {
area.engagementTypes.forEach((type) => {
type.engagements.forEach((engagement) => {
engagement.members.forEach((member) => {
if (!accountPositions[member.account.id]) return;
console.log('position updated from ', member.position.positionTitle, 'to', accountPositions[member.account.id]);
member.position.positionTitle = accountPositions[member.account.id];
});
});
});
});
当然,诀窍是首先将数据映射到一个对象(这样您就不必一直在两个数组上搜索),然后有条件地设置值(正如我看到的,您的第一个管理器实际上没有匹配的位置) 因此,要创建字典以便在以后的模型中使用,可以首先执行以下操作
// first map the accountId to positions
const accountIdToPositionDict = individualData.reduce( (current, item) => {
current[item.account.id] = (item.positions.filter( position => position.isPrimary )[0] || {} ).positionTitle;
return current;
}, {} );
这将有一个对象,其中accountidtopositionict[“123”]
将是常务董事
,然后将复制逻辑更改为:
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
}
}))
}))}))
}))
};
然后根据字典中找到的accountId设置位置,如果没有找到匹配项,则根据原始标题设置位置
const individualData=[{
“账户”:{
“id”:“001b000003WnPy1AAF”,
“全名”:“jeff bint”
},
“职位”:[{
“id”:“A160000004AXEBAAS”,
“组织ID”:“001b0000005gxmlAAA”,
“组织名称”:“a”,
“职位名称”:“能源部高级经理”,
“职位级别”:“5-中层管理人员和顾问”,
“isPrimary”:对,
“起始日期”:“2016-10-07”,
“结束日期”:空
}]
}, {
“账户”:{
“id”:“0010X000048DDMsQAO”,
“全名”:“edy long”
},
“职位”:[{
“id”:“a160X000004nKfhQAE”,
“组织ID”:“001b0000005gxmlAAA”,
“组织名称”:“a”,
“职位名称”:“总经理”,
“职位级别”:“4-业务部门负责人/区域负责人”,
“isPrimary”:对,
“起始日期”:“2018-03-05”,
“结束日期”:空
}]
}, {
“账户”:{
“id”:“123”,
“全名”:“约翰·波尔”
},
“职位”:[{
“id”:“325345634634”,
“组织ID”:“001b0000005gxmlAAA”,
“组织名称”:“a”,
“职位名称”:“总经理”,
“职位级别”:“4-业务部门负责人/区域负责人”,
“isPrimary”:对,
“起始日期”:“2018-03-05”,
“结束日期”:空
}]
}
];
常量图形数据={
“名称”:“年度会议”,
“约定区域”:[{
“id”:“1”,
“约定类型”:[{
“名称”:“林业”,
“约定”:[]
},
{
“名称”:“房屋”,
“约定”:[{
“名称”:“约定1”,
“成员”:[{
“id”:“e334”,“账户”:{
id:“eefe”,“全名”:“jim bean”
},
“职位”:{
“id”:“3434”,
“职位名称”:“经理”
}
}]
}]
},
{
“名称”:“景观”,
“约定”:[{
“名称”:“约定1343”,
“成员”:[{
“id”:“e334”,“账户”:{
id:“123”,“全名”:“约翰·波尔”
},
“职位”:{
“id”:“4545”,
“职位名称”:“高级经理”
}
}]
}]
}
]
},
{
“名称”:“社区日”,
“约定类型”:[{
“名称”:“skyscraping”,
“约定”:[]
},
{
“姓名”:“网球”,
“约定”:[{
“名称”:“约定346”,
“成员”:[{
“id”:“34”,“账户”:{
“id”:“0010X000048DDMsQAO”,“全名”:“edy long”
},
“职位”:{
“id”:“3999434”,
“职位名称”:“终极经理”
}
}]
}]
},
{
“名称”:“榨汁”,
“约定”:[{
“名称”:“347343”,
“成员”:[{
“id”:“4546”,“账户”:{
“id”:“001b000003WnPy1AAF”,“全名”:“jeff bint”
},
“职位”:{
“id”:“35006”,
“职位名称”:“高级最终经理”
}
}]
}]
}]
}]
};
//首先将accountId映射到positions
const AccountIDTopositionICT=个人数据。减少((当前,项目)=>{
当前[item.account.id]=(item.positions.filter(position=>position.isPrimary)[0]|{}).positionTitle;
回流;
}, {} );
//然后在映射函数中使用它
常量UpdateGraphTable={…graphData,
engagementAreas:graphData.engagementAreas.map(area=>({…area,
engagementTypes:area.engagementTypes.map(类型=>({…类型,
约定:type.engagents.map(约定=>({…约定,
成员:engagement.members.map(成员=>({…成员,
位置:{…member.position,
//使用找到的positionTitle或提供的原始positionTitle
职位名称:member.account&&accountidtopositionict[member.account.id]| | member.position.positionTitle
}
}))
}))}))
}))
};
console.log(updateGraphTable)代码>…您的代码?您好,我知道它与您的有所不同,但只是略有不同,因为您有member.account.id
,您可以在您的个人职位中搜索,我只是不确定您的问题可能出在哪里be@Sparlarva啊,好的,对不起。忽略了它,坐在摇摇晃晃的火车上再次感谢你的帖子icepickle,我只是在工作,明天早上我会回来的。再次感谢你。我遗漏了一些东西——在个人数据中,一些员工有多个职位,他们的职位被命名为“isPrimary”:如果他们有
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
}
}))
}))}))
}))
};