【问题标题】:How to properly use recursion with Json data and structure it如何正确使用 Json 数据的递归并对其进行结构化
【发布时间】:2022-01-23 17:09:10
【问题描述】:

我正在编写一个代码,该代码从节点应用程序中的 mssql 服务器获取 Json 数据。 场景是:

  1. 我在第一次 API 调用时根据主管的用户名获取经理列表,每个经理都有一个用户名。
  2. 基于该用户名,我运行一个递归函数来遍历数据库以获取他们的子经理。等等。

最终目标:将集体数据返回到 JSON 响应中 我想要的输出应该是:

{
Username:"Head-manager Username",
children:[
   {
    Username:"manager Username",
    children:[{
     {
       Username:"Sub-manager Username",
       children:[]}
   }]
.
.
.
}
]

}

我的代码:


function getTreeData(dataset, newObj = {}) {
  return dataset.map(async (employee, index) => {
    let query = `SELECT [Username], [First Name], [Last Name] FROM TBL_M_FACT_EMPLOYEE_CENTRAL_ACTIVE WHERE [Reporting Manager User Sys ID] = '${employee.Username}'`;

    let data = await config.sequelize.query(query, {
      type: config.sequelize.QueryTypes.SELECT,
    });


    newObj={...newObj,data}
  

      console.log("--------------------------");
      console.log(query);
      // console.log(data);
      console.log(newObj)

      console.log("--------------------------");
    if(data.length === 0){
      return newObj
    }else{
      getTreeData(data);
    }
    
  });

}

authRouter.get("/getEmployeeData", async (req, res, next) => {
  try {
    console.log("Initi");
    let sql_Query = `SELECT [Username], [First Name], [Last Name] FROM TBL_M_FACT_EMPLOYEE_CENTRAL_ACTIVE WHERE [Reporting Manager User Sys ID] = 'T502217'`;
    let result = await config.sequelize.query(sql_Query, {
      type: config.sequelize.QueryTypes.SELECT,
    });

    console.log("Loop started Finally");

    getTreeData(result);

    res.status(200).json({
      username: "T502217",
      chilren: result,
    });
  } catch (error) {
    console.log(error);
  }
});

【问题讨论】:

  • 好的。你有问题吗?这段代码不符合您的预期吗?
  • 不,我什至不确定我的代码是否正确
  • 请阅读asking good questions。我不知道您的代码是否正确而无法运行。和search 有关 SO 的相关主题。这是一个常见的问题。
  • 我在那里有点匆忙。我绝对可以看到为什么这段代码不会工作的几个原因。您不会从递归调用中返回任何内容,而只会从您的基本调用中返回。并且您映射异步调用而不使用Promise.all 或其他方式来组合它们。

标签: javascript node.js api recursion


【解决方案1】:

这是一个做类似事情的函数。 sn-p 包含一个虚拟数据库,它将基于同样具有manager 属性的此类对象的固定数组返回{id, first, last} 对象数组。 (这真的是一个假人,本质上是在您的查询字符串中寻找'<some id>' 并为他们的经理找到所有具有该ID 的记录。它不理解您的其余SQL。)

我们的函数是getTreeData 它接受一个经理并返回该经理的报告树。它的参数默认为'',所以如果我们不提供任何东西,它会得到所有没有经理的人(大概只有最高老板。)

虽然我们在这里保留了您的 getTreeData 名称,但请注意它实际上是用词不当。它返回的不是一棵树,而是整个森林。

剩下的代码是我在你的路线中所期望的。我没有尝试重写它。本质上,调用getTreeData () 将返回一个对顶级成员数组的承诺。您可能需要针对'T502217' 的固定输入进行调整。

const getTreeData = async (id = '') =>
  db .query (`SELECT id, first, last FROM ACTIVE_EMPLOYEES WHERE manager = '${id}'`).
    then (reports => Promise .all (
      reports .map (report => getTreeData (report.id) .then (children => ({...report, children})))
    ))
  
getTreeData ()
  .then (ceos => ceos [0]) // there can be only one! :-)
  .then (console .log)
  .catch (console .warn)
.as-console-wrapper {max-height: 100% !important; top: 0}
<script>
// dummy database, only reponds to one parameterized query
const db = (() => {
  const activeEmployees = [
    {id: 'A23423', first: 'Fred', last: 'Flintstone', manager: 'C12345'},
    {id: 'A23571', first: 'Betty', last: 'Rubble', manager: 'A98765'},
    {id: 'A34567', first: 'Barney', last: 'Rubble', manager: 'C24680'},
    {id: 'A98765', first: 'Wilma', last: 'Flintstone', manager: 'C12345'},
    {id: 'C12345', first: 'Pebbles', last: 'Flintstone', manager: ''}, // the CEO!
    {id: 'C24680', first: 'BamBam', last: 'Rubble', manager: 'A98765'},
    {id: 'P13579', first: 'Dino', last: 'Flintstone', manager: 'C12345'},
  ]
  return {
    // ex: "SELECT id, first, last FROM ACTIVE_EMPLOYEES WHERE manager = '<some id>'" 
    query: async (str, id = str .match (/'([^']*)'/) [1]) =>
      Promise .resolve (
        activeEmployees .filter (({manager}) => manager == id) .map (({id, first, last}) => ({id, first, last}))
      )
  }
})()
</script>

db 代码没有什么有趣的地方,只是为了证明这一点。这个想法是这样的:

db .query (`SELECT id, first, last from ACTIVE_EMPLOYEES WHERE manager = 'A98765'`) 

将返回一个使用如下数据解析的承诺:

[
  {id: "A23571", first: "Betty", last: "Rubble"}, 
  {id: "C24680", first: "BamBam", last: "Rubble"}
]

因为 Betty 和 BamBam 有 Wilma (id A98765) 作为他们的经理。

【讨论】:

    猜你喜欢
    • 2010-11-04
    • 2017-11-28
    • 1970-01-01
    • 2013-04-17
    • 2022-10-24
    • 2017-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多