javascript - 如何在javascript中填充平面数组
问题描述
我的目标是创建一个自动排序以下数据的树状结构。subSkills 属性包含对其他技能的 id 引用列表。
[
{
name: "chess";
subSkills: [];
parentId: "games";
_id: "chess";
},
{
name: "games";
subSkills: ["chess",...];
parentId: "";
_id: "games";
},
]
export default interface ISkill {
name: string;
subSkills: string[] | ISkill[];
parentId: string;
_id: string;
}
结果应该是这样的。
[
{
name: "games";
subSkills: [
{
name: "chess";
subSkills: [{}...];
parentId: "games";
_id: "chess";
}
];
parentId: "";
_id: "games";
}, ... {}
]
我应该注意,该函数必须能够处理任何深度级别。由于我没有这样的经验,如果有人能描述他们的思维方式,我将不胜感激。
提前致谢。
编辑:我在数据库中有多个树/根。所以多个技能都有一个“”作为parentId。
解决方案
根据我的理解,给定数组的每个对象都将是另一个根对象的根或子对象。我不知道您是否错误地填充了对象的 subSkills 数组,或者是否需要考虑是否应该将其替换为整个对象?根据我的假设,我现在只是没有 subSkills 作为字符串,我将所有 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));
注意 如果您可以(并且可以)将数据结构更新为 Map 或文字对象,则该算法将比使用数组更快,这是一个具有额外深度嵌套级别的示例:
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));
推荐阅读
- database - 在微服务架构中扩展数据模型
- javascript - 测试功能的存在无法正常工作
- c# - 如何使用数据库中的数据在 C# 中创建折线图?
- asp.net-core - 尝试激活“BuySell_20190423.Controllers.StockController”时无法解析“System.String”类型的服务
- r - 如何禁用闪亮显示值的编辑选项?
- postgresql - org.postgresql.util.PSQLException:错误:无法在只读事务中执行 INSERT
- python - 使用 super 与 __getitem__ 与下标
- pandas - Python Pandas 数据框:如何对来自不同列的值进行分组
- sql-server - 无法启用 FilleStream
- ruby-on-rails - 安装bootsnap(1.4.4)时出错,win10中rails new后Bundler无法继续