我已经尝试了几天,但是似乎无法正常工作。
我有一个如下所示的MySQL表:
empName empID empManagerID
-------------------------------------------------- ----------
亚历克斯经理125354 987654
简·多伊223535 125354
弗洛伊德·古兹曼654354 125354
艾玛·弗莱彻325150 212335
托尼·科普兰456842 325150
本杰明·普拉特(Benjamin Pratt)231543 325150
卡桑德拉·加德纳656560 325150
弗雷德里克·布罗格顿783487 239873
迪安格洛·格兰顿823402 783487
杰拉尔丁·布拉* 230123 783487
Jayna Lemmond 182739 783487
夏季Wirtz 849734 783487
克莱雷莎·谢弗983787 783487
Tanna Boelter 345623 * 230123
查尔塞塔·德博特923476 230123
迈克尔·古因456782 230123
多米尼克·皮拉伊诺(Dominick Piraino)956235 125354
Shavonne Ovellette 108934 125354
通过提供经理的employeeID作为起点,我希望能够找到所有报告给特定managerID的人员姓名。
例如:Select * from tableName where empManagerID = '125354';
这应该返回:
简·多伊223535 125354
弗洛伊德·古兹曼654354 125354
多米尼克·皮拉伊诺(Dominick Piraino)956235 125354
Shavonne Ovellette 108934 125354
然后,我需要获取结果的每个empID,并使用empID作为empManagerID创建多个查询,以找到向结果中的人员报告(如果有)的所有人员。
这需要一直进行到最终查询基本上为空为止。
在我的课程助教的帮助下,我取得了以下成就:
函数getEmployees(employerID){
const query =`
选择empName,empID,empManagerID
从myTable
哪里empManagerID = $ {employerID}
`;
返回新的Promise((resolve,reject)=> {
con.query(query,(err,rows,fields)=> {
返回解析(行);
});
});
}
getEmployees(125354)
.then((员工)=> {
//将返回的结果推入某种数组。
const empPromises = employee.map((e)=> {
返回getEmployees(e.empID)
});
返回Promise.all(empPromises);
})
//将fs.writeFile导出到reports.json文件中,以备将来参考。
上面的代码有效,但是似乎没有递归地提取结果,我不知道为什么。实际表有成千上万的行,具有许多级别的员工=>经理=> sr经理关系
如果我尝试将另一个.then()与另一个对getEmployees的调用链接在一起,它只会返回一堆承诺-而不是结果。但是,如果我console.log(行),则可以看到结果。
我是JS的新手,仍然在学习...但是我无法弄清楚这一点。
任何帮助将不胜感激。
最佳答案
对于递归,您需要一个调用自身的函数(或以某种方式导致其自身被调用)。
并且在每次迭代中,您需要:
查找给定员工的下属(部分或全部)
返回下属列表加上每个下属的下属
由于递归,在下一级执行相同的操作,最终导致原始呼叫者最终收到所有下属,下属的下属,下属的下属等的列表。
// modified data, expressed as a javascript object-literal
var allEmployees = [
{ 'empName':'Alex Manager', 'empID':'125354', 'empManagerID':'987654' },
{ 'empName':'Jane Doe', 'empID':'223535', 'empManagerID':'125354' },
{ 'empName':'Floyd Guzman', 'empID':'654354', 'empManagerID':'125354' },
{ 'empName':'Irma Fletcher', 'empID':'325150', 'empManagerID':'125354' },
{ 'empName':'Toni Copeland', 'empID':'456842', 'empManagerID':'325150' },
{ 'empName':'Benjamin Pratt', 'empID':'231543', 'empManagerID':'325150' },
{ 'empName':'Cassandra Gardner', 'empID':'656560', 'empManagerID':'325150' },
{ 'empName':'Fredrick Brogdon', 'empID':'783487', 'empManagerID':'239873' },
{ 'empName':'Deangelo Glandon', 'empID':'823402', 'empManagerID':'783487' },
{ 'empName':'Geraldine Brar', 'empID':'230123', 'empManagerID':'231543' },
{ 'empName':'Jayna Lemmond', 'empID':'182739', 'empManagerID':'783487' },
{ 'empName':'Summer Wirtz', 'empID':'849734', 'empManagerID':'783487' },
{ 'empName':'Claretha Sheffer', 'empID':'983787', 'empManagerID':'783487' },
{ 'empName':'Tanna Boelter', 'empID':'345623', 'empManagerID':'230123' },
{ 'empName':'Charlesetta Debolt', 'empID':'923476', 'empManagerID':'230123' },
{ 'empName':'Michael Gouin', 'empID':'456782', 'empManagerID':'230123' },
{ 'empName':'Dominick Piraino', 'empID':'956235', 'empManagerID':'125354' },
{ 'empName':'Shavonne Ovellette', 'empID':'108934', 'empManagerID':'125354' }
];
// simple filter in place of SQL
function getEmployeesOf(employerID) {
return Promise.resolve(allEmployees.filter(emp => emp.empManagerID === employerID));
}
// recursive function (it calls itself)
function drillDown(employerID) {
return getEmployeesOf(employerID).then(employees => {
let promises = employees.map(emp => drillDown(emp.empID));
return Promise.all(promises).then(emps => employees.concat(...emps)); // spreading here avoids the need to flatmap later.
});
}
drillDown('125354').then(results => {
console.log('Results: ', results);
});
DEMO具有上面修改的数据,这应该给出12名员工的列表。
为了进行比较,如果一切都是同步的,这两个函数将是这样的:
function getEmployeesOf(employerID) {
return allEmployees.filter(emp => emp.empManagerID === employerID);
}
function drillDown(employerID) {
let employees = getEmployeesOf(employerID);
return employees.concat(...employees.map(emp => drillDown(emp.empID)));
}
DEMO具有相同的修改数据