Данные объектов, которые будут обновлены значением из массива - PullRequest
0 голосов
/ 10 сентября 2018

Я пытаюсь обновить поле 'positionTitle' моего объекта graphData с полями 'positionTitle' моего массива IndividualData.

Мне нужно сделать это точно, оба набора данных имеют «учетные записи», которые имеют одинаковый идентификатор и полное имя для пользователя, я надеялся попробовать и использовать это для сопоставления.

Я хочу, чтобы 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 голосов
/ 10 сентября 2018

Конечно, уловка заключается в том, чтобы сначала отобразить ваши данные в объект (чтобы вам не приходилось все время искать по обоим массивам), а затем условно установить значение (как я увидел, что ваш первый менеджер не действительно нет подходящей позиции).

Итак, чтобы создать словарь для использования в вашей более поздней модели, вы можете сначала сделать

// 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"] будет Managing Director, а затем изменить дублирующую логику на:

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

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

      }
    }]
}]
 }]
}]
};

// 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;
}, {} );

// then use it in the mapping function
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
            }
          }))
        }))}))
    }))
  };
  
console.log( updatedGraphTable );
0 голосов
/ 10 сентября 2018

Попробуйте код ниже.

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];
                });
            });
        });
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...