如何在javascript中填充平面数组

如何在javascript中填充平面数组,javascript,tree,populate,Javascript,Tree,Populate,我的目标是创建一个树状结构,自动对以下数据排序。 subSkills属性包含对其他技能的id引用列表 [ { name: "chess"; subSkills: []; parentId: "games"; _id: "chess"; }, { name: "games"; subSkills: ["chess",...]; pa

我的目标是创建一个树状结构,自动对以下数据排序。 subSkills属性包含对其他技能的id引用列表

[
  {
    name: "chess";
    subSkills: [];
    parentId: "games";
    _id: "chess";
  },
  {
    name: "games";
    subSkills: ["chess",...];
    parentId: "";
    _id: "games";
  },
]
结果应该是这样的

[
 {
  name: "games";
  subSkills: [
    {
      name: "chess";
      subSkills: [{}...];
      parentId: "games";
      _id: "chess";
    }
  ];
  parentId: "";
  _id: "games";
 }, ... {}
]
我应该注意,该函数必须能够处理任何深度。因为我没有这方面的经验 诸如此类的事情,如果有人能描述一下他们的思维方式,我将不胜感激

提前谢谢


编辑:我在数据库中有多棵树/根。因此多个技能都有一个“”作为parentId。

根据我的理解,给定数组的每个对象都将是另一个根对象的根对象或子对象。我不知道您是否错误地填充了一个对象的subSkills数组,或者这是一个需要考虑的问题,因此如果找到,应该用整个对象替换它?根据我的假设,我只是暂时没有子技能作为字符串,我将所有子技能设置为空数组作为开始,请告诉我这是否应该考虑。否则,您实际上只需查看是否满足该字符串,然后就可以将其从数组中移除,并用子对象本身替换它

以下是我的解决方案:

const givenArray = [
  {
    name: "chess",
    subSkills: [],
    parentId: "games",
    _id: "chess",
  },
  {
    name: "games",
    subSkills: [],
    parentId: "",
    _id: "games",
  },
  {
    name: "programming dev",
    subSkills: [],
    parentId: "chess",
    _id: "programming",
  },
  {
    name: "basketball 01",
    subSkills: [],
    parentId: "chess",
    _id: "basketball",
  },
];
const skillsAggregator = (skills) => {
  const newSkills = [...skills];

  newSkills.forEach((skill) => {
    if (!!skill.parentId.length) {
      addSubSkills(newSkills, skill);
    }
  });

  return newSkills;
};
const addSubSkills = (skills, currentSkill) => {
  for (let i = 0; i < skills.length; i++) {
    const skill = skills[i];

    if (currentSkill.parentId === skill._id) {
      skill.subSkills.push(currentSkill);
      break;
    }
  }
};

console.log(JSON.stringify(skillsAggregator(givenArray), null, 2));
const givenArray = [
  {
    name: "chess",
    subSkills: [],
    parentId: "games",
    _id: "chess",
  },
  {
    name: "games",
    subSkills: [],
    parentId: "",
    _id: "games",
  },
  {
    name: "programming dev",
    subSkills: [],
    parentId: "chess",
    _id: "programming",
  },
  {
    name: "basketball 01",
    subSkills: [],
    parentId: "chess",
    _id: "basketball",
  },
];
const skillsAggregator = (skills) => {
  const newSkills = [...skills];

  newSkills.forEach((skill) => {
    if (!!skill.parentId.length) {
      addSubSkills(newSkills, skill);
    }
  });

  return newSkills;
};
const addSubSkills = (skills, currentSkill) => {
  for (let i = 0; i < skills.length; i++) {
    const skill = skills[i];

    if (currentSkill.parentId === skill._id) {
      skill.subSkills.push(currentSkill);
      break;
    }
  }
};

console.log(JSON.stringify(skillsAggregator(givenArray), null, 2));
const givenArray = {
  chess: {
    name: "chess",
    subSkills: [],
    parentId: "games",
    _id: "chess",
  },
  games: {
    name: "games",
    subSkills: [],
    parentId: "",
    _id: "games",
  },
  programming: {
    name: "programming dev",
    subSkills: [],
    parentId: "chess",
    _id: "programming",
  },
  basketball: {
    name: "basketball 01",
    subSkills: [],
    parentId: "chess",
    _id: "basketball",
  },
  football: {
    name: "football",
    subSkills: [],
    parentId: "basketball",
    _id: "football",
  },
};
const skillsAggregator = (skills) => {
  const newSkills = { ...skills };

  Object.entries(newSkills).forEach(([id, skill]) => {
    if (!!skill.parentId.length) {
      newSkills[skill.parentId].subSkills.push(skill);
    }
  });

  return newSkills;
};

console.log(JSON.stringify(skillsAggregator(givenArray), null, 2));