Javascript 要使用数组中的值更新的对象数据

Javascript 要使用数组中的值更新的对象数据,javascript,arrays,object,Javascript,Arrays,Object,我正在尝试用我的individualData数组的“positionTitle”字段更新graphData对象的“positionTitle”字段 我需要准确地做到这一点,两组数据都有“帐户”,它们都有相同的用户id和全名,我希望尝试使用它来进行匹配 我希望来自具有相同帐户id或名称(以较容易的为准)的用户的positionTitle进入对象字段 这就是我目前拥有的: 我的对象(我要更新的对象): 我要获取其位置标题的数组: IndividualData = [{ "account": {

我正在尝试用我的individualData数组的“positionTitle”字段更新graphData对象的“positionTitle”字段

我需要准确地做到这一点,两组数据都有“帐户”,它们都有相同的用户id和全名,我希望尝试使用它来进行匹配

我希望来自具有相同帐户id或名称(以较容易的为准)的用户的positionTitle进入对象字段

这就是我目前拥有的: 我的对象(我要更新的对象):

我要获取其位置标题的数组:

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