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

时间:2018-09-10 13:39:47

标签: javascript arrays object

我试图用我的personalData数组的“ positionTitle”字段更新graphData对象的“ positionTitle”字段。

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

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

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

graphData = {

"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": "Senior Manager"

      }
      }]
     }]
    }
   ]
},

{
"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": "Ultime Manager"
            }
          }]
        }]
      },
 {
  "name": "Juicing",
  "engagements": [{
    "name": "347343",
    "members": [{
        "id": "4546", "account": {
            "id": "001b000003WnPy1AAF", "fullName": "jeff bint"
        },
      "position": {
        "id": "35006",
        "positionTitle": "Senior Ultimate Manager"

      }
    }]
}]
 }]
}]
}

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

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

}

2 个答案:

答案 0 :(得分:1)

当然,诀窍是先将数据映射到对象中(这样您就不必一直在两个数组上进行搜索),然后有条件地设置值(如我所见,您的第一个管理器不会确实没有合适的职位)。

因此,要创建要在以后的模型中使用的字典,您可以先进行

<div class="weird-reindeers" ng-repeat="Deer in Reindeers | orderBy: orderByBears"></div>

这将有一个对象,其中shell: "docker inspect --format {{ '{{ .NetworkSettings.IPAddress }}' }} instance1" 将是// 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; }, {} ); ,然后将复制逻辑更改为:

accountIdToPositionDict["123"]

然后根据词典中找到的accountId设置位置,如果找不到匹配项,则根据原始标题设置位置

Managing Director

答案 1 :(得分:0)

尝试下面的代码。

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