我想从我的Mysql数据响应创建一个层次 struct ,它有jsut id和sponsor_id.我不知道如何开始,请帮助我解决这个问题

[ { "id": 2723021, "sponsor_id": "2723020" }, { "id": 2723022, "sponsor_id": "2723021" }, { "id": 2723023, "sponsor_id": "2723021" }, { "id": 2723024, "sponsor_id": "2723021" }, { "id": 2723025, "sponsor_id": "2723022" }, { "id": 2723026, "sponsor_id": "2723022" }, { "id": 2723027, "sponsor_id": "2723022" }, { "id": 2723028, "sponsor_id": "2723023" }, { "id": 2723029, "sponsor_id": "2723023" }, { "id": 2723030, "sponsor_id": "2723023" }, { "id": 2723031, "sponsor_id": "2723024" }, { "id": 2723032, "sponsor_id": "2723024" }, { "id": 2723033, "sponsor_id": "2723024" }, { "id": 2723034, "sponsor_id": "2723025" } ]

I want to make it like this

什么都没有出现在我的脑海里什么怎么开始&

推荐答案

只需按项目ID创建一个映射,找到父项并添加子项,如果没有找到父项,则是根项目.

const arr = [ { "id": 2723021, "sponsor_id": "2723020" }, { "id": 2723022, "sponsor_id": "2723021" }, { "id": 2723023, "sponsor_id": "2723021" }, { "id": 2723024, "sponsor_id": "2723021" }, { "id": 2723025, "sponsor_id": "2723022" }, { "id": 2723026, "sponsor_id": "2723022" }, { "id": 2723027, "sponsor_id": "2723022" }, { "id": 2723028, "sponsor_id": "2723023" }, { "id": 2723029, "sponsor_id": "2723023" }, { "id": 2723030, "sponsor_id": "2723023" }, { "id": 2723031, "sponsor_id": "2723024" }, { "id": 2723032, "sponsor_id": "2723024" }, { "id": 2723033, "sponsor_id": "2723024" }, { "id": 2723034, "sponsor_id": "2723025" } ]


const map = arr.reduce((r, item) => (r[item.id] = item, r), {});
let root;
Object.values(map).forEach(item => {
  const parent = map[item.sponsor_id];
  parent ? (parent.children ??= []).push(item) : root = item;
});

console.log(root);

更简单的版本:

const arr = [ { "id": 2723021, "sponsor_id": "2723020" }, { "id": 2723022, "sponsor_id": "2723021" }, { "id": 2723023, "sponsor_id": "2723021" }, { "id": 2723024, "sponsor_id": "2723021" }, { "id": 2723025, "sponsor_id": "2723022" }, { "id": 2723026, "sponsor_id": "2723022" }, { "id": 2723027, "sponsor_id": "2723022" }, { "id": 2723028, "sponsor_id": "2723023" }, { "id": 2723029, "sponsor_id": "2723023" }, { "id": 2723030, "sponsor_id": "2723023" }, { "id": 2723031, "sponsor_id": "2723024" }, { "id": 2723032, "sponsor_id": "2723024" }, { "id": 2723033, "sponsor_id": "2723024" }, { "id": 2723034, "sponsor_id": "2723025" } ]


const map = {};
for(const item of arr) map[item.id] = item;
let root;
for(const id in map){
  const item = map[id];
  const parent = map[item.sponsor_id];
  if(parent){
    if(!parent.children) parent.children = [];
    parent.children.push(item);
  }else{
    root = item;
  }
}

console.log(root);

Javascript相关问答推荐

如何解决chrome—extension代码中的错误,它会实时覆盖google—meet的面部图像?'

docx.js:如何在客户端使用文档修补程序

Next.js(react)使用moment或不使用日期和时间格式

成功完成Reducers后不更新状态

空的结果抓取网站与Fetch和Cheerio

Chart.js 4.4.2,当悬停在一个数据点上时,如何在工具提示中拥有多个数据点/标签?

如何将数据块添加到d3力有向图中?

Rxjs流中生成IMMER不能在对象上操作

未捕获语法错误:Hello World中的令牌无效或意外

React:防止useContext重新渲染整个应用程序或在组件之间共享数据而不重新渲染所有组件

更改agGRID/Reaction中的单元格格式

Angel Auth Guard-用户只有在未登录时才能访问登录页面,只有在登录时才能访问其他页面

AstroJS混合模式服务器终结点返回404

如何调整下拉内容,使其不与其他元素重叠?

使用Java脚本在div中创建新的span标记

将字符串解释为数字;将其重新编码为另一个基数

暂停后只有一次旋转JS

验证Java脚本函数中的两个变量

用内嵌的含selenium的Java脚本抓取网站

如何将缓冲区数组转换回音频