首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在javascript中填充平面数组

如何在javascript中填充平面数组
EN

Stack Overflow用户
提问于 2020-08-05 10:41:15
回答 1查看 61关注 0票数 0

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

代码语言:javascript
复制
[
  {
    name: "chess";
    subSkills: [];
    parentId: "games";
    _id: "chess";
  },
  {
    name: "games";
    subSkills: ["chess",...];
    parentId: "";
    _id: "games";
  },
]
代码语言:javascript
复制
export default interface ISkill {
  name: string;
  subSkills: string[] | ISkill[];
  parentId: string;
  _id: string;
}

结果应该是这样的。

代码语言:javascript
复制
[
 {
  name: "games";
  subSkills: [
    {
      name: "chess";
      subSkills: [{}...];
      parentId: "games";
      _id: "chess";
    }
  ];
  parentId: "";
  _id: "games";
 }, ... {}
]

我应该指出,这个函数必须能够处理任何深度。由于我没有这样的经验,如果有人能描述他们的想法,我会很感激的。

提前谢谢。

编辑:我在数据库中有多个树/根。所以多项技能有一个“parentId”。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-05 11:55:34

根据我的理解,给定数组的每个对象要么是根对象,要么是另一个根对象的子对象。我不知道您是否错误地填充了对象的subSkills数组,或者如果找到了,是否应该考虑将其替换为整个对象?根据我的假设,我现在不使用subSkills作为字符串,我首先将所有subSkills设置为空数组,如果需要考虑这一点,请告诉我。否则,您实际上只需查看字符串是否满足,就可以从数组中删除它,并将其替换为子对象本身。

这是我的解决方案:

代码语言:javascript
复制
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));

注意到如果您可以将数据结构(并且可以)更新为Map或文字对象,则该算法将比使用数组的速度更快,下面是一个具有额外深度嵌套级别的示例:

代码语言:javascript
复制
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));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63263424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档