簡體   English   中英

如何在 javascript 中填充平面數組

[英]How to populate a flat array in 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";
 }, ... {}
]

我應該注意到 function 必須能夠處理任何深度級別。 由於我沒有這樣的經驗,如果有人能描述他們的思維方式,我將不勝感激。

提前致謝。

編輯:我在數據庫中有多個樹/根。 所以多個技能都有一個“”作為parentId。

根據我的理解,給定數組的每個 object 將是另一個根 object 的根或子。 我不知道您是否錯誤地填寫了 object 的 subSkills 數組,或者是否需要考慮是否應該將其替換為整個 object 如果發現? 根據我的假設,我現在只是沒有 subSkills 作為字符串,我將所有 subSkills 設置為空數組開始,請告訴我是否應該考慮這個問題。 否則,您實際上可以查看是否滿足該字符串,然后您可以將其從數組中刪除並用子 object 本身替換它。

這是我的解決方案:

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 或文字 object,則該算法將比使用數組更快,這是一個具有超深嵌套級別的示例:

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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM