【问题标题】:How to iterate over a tree of linked objects and return them as an array? [duplicate]如何遍历链接对象树并将它们作为数组返回? [复制]
【发布时间】:2023-03-17 01:01:01
【问题描述】:

有来自家庭树的家庭成员存储在数据库中。该函数(如下)应该查询用户的所有亲属,并将他们的联系人和元数据添加到列表中,以作为唯一条目与每个人一起返回(顺序无关紧要)。

问题是这个函数只返回一个家庭度数。亲子关系较低的每个人都被省略了。

async function getFamilyMembers(memberId) {
  let relativesList = [];
  let relativesdescendantsList = [];

  //local database
  //returns [] if nothing is found
  //returns an array of  objects if finds anything
  //items returned contain .id
  let relatives = await realmInstance
    .objects("FamilyMember")
    .filtered(`member.id="${memberId}"`);

  if (relatives) {
    relatives.forEach(async (relative) => {

      //external function to add relative metadata
      //like name, family branch, etc
      //it keeps the relative.id for use below
      let relativeData = fillData(relative);

      relativesList.push(JSON.stringify(relativeData));

      let newList = await getFamilyMembers(relative.id);
      relativesdescendantsList = [...newList, ...relativesList];
    });

    return relativesList.concat(relativesdescendantsList);
  } else {
    return relatives;
  }
}

我认为问题与递归的工作方式有关。在最低的分支上,当然孩子们没有孩子,所以他们返回一个空数组

//relative.id is the id of the kid
let newList = await getFamilyMembers(relative.id);

所以,newList 是一个空数组,但 relativeData 不应该为空,但在控制台上我也将它作为一个空数组,即使我(相信)我正在推动孩子元数据进入数组。

【问题讨论】:

  • 为什么使用await getFamilyMembers?此方法中没有 API 调用。看起来你不应该在这里使用递归,因为你正在使用 API 调用。相反,只需在用户单击树中的项目时进行 API 调用。
  • @StepUp await realmInstance 的行为类似于 API 调用,因为查询本地磁盘需要时间。

标签: javascript arrays node.js recursion tree


【解决方案1】:

您在每个 forEach 循环中覆盖 relativesdescendantsList = [...newList, ...relativesList];,然后在 forEach 循环之外连接 relativesList.concat(relativesdescendantsList);,但您只连接 relativesdescendantsList 的最后一个值,这对我来说似乎不正确。

你也这样做if(relatives) ... else return relatives;所以你只有在没有亲戚的时候才会返回,为什么?

我已经简化了一点:

async function getFamilyMembers(memberId) {
  let relativesList = [];

  let relatives = await realmInstance
    .objects("FamilyMember")
    .filtered(`member.id="${memberId}"`);

  relatives.forEach(async (relative) => {

    relativesList.push(fillData(relative));

    let newList = await getFamilyMembers(relative.id);
    relativesList = [...relativesList, ...newList];
  });

  return relativesList;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 2022-01-15
    • 2020-10-02
    • 1970-01-01
    • 2021-09-26
    • 2019-06-29
    • 1970-01-01
    相关资源
    最近更新 更多