当前位置: 首页 > 知识库问答 >
问题:

javascript - 如何将一个并列形式的数组对象,根据字段改为嵌套形式?

云联
2024-02-27

我有如下代码:

Chapters = [{  level: '1',  content: '案例概况010000-170900',  url: '案例概况010000-170900.html'},{  level: '2',  content: '案例概况010100-170901',  url: '案例概况010100-170901.html'},{  level: '2',  content: '案例概况010200-170902',  url: '案例概况010200-170902.html'},{  level: '3',  content: '案例概况010201-170903',  url: '案例概况010201-170903.html'},{  level: '1',  content: '案例概况020000-170904',  url: '案例概况020000-170904.html'},{  level: '1',  content: '案例概况030000-170905',  url: '案例概况030000-170905.html'},{  level: '2',  content: '案例概况030100-170906',  url: '案例概况030100-170906.html'}]

我想将上述代码按照 level 字段划分,改造成如下格式

Chapters = [{  level: '1',  content: '案例概况010000-170900',  url: '案例概况010000-170900.html',  Childs: [{    level: '2',    content: '案例概况010100-170901',    url: '案例概况010100-170901.html',    Childs: []  },{      level: '2',      content: '案例概况010200-170902',      url: '案例概况010200-170902.html',    Childs: [{      level: '3',      content: '案例概况010201-170903',      url: '案例概况010201-170903.html'    }]  }]},{  level: '1',  content: '案例概况020000-170904',  url: '案例概况020000-170904.html',  Childs: []},{  level: '1',  content: '案例概况030000-170905',  url: '案例概况030000-170905.html',  Childs: [{    level: '2',    content: '案例概况030100-170906',    url: '案例概况030100-170906.html'  }]}]

层级可能不限于 3 级,所以我能想到的是使用递归,但是尝试写了几遍均已失败告终
还望解答,万分感谢!

共有2个答案

越心水
2024-02-27
interface Chapter {    level: string    content: string    url: string    children?: Chapter[]}function insert(arr: Chapter[], cpt: Chapter, level = 1) {    if (cpt.level === `${level}`) arr.push(cpt)    else {        const c = arr.find(            c =>                c.content.slice(0, 4 + level * 2) ===                cpt.content.slice(0, 4 + level * 2)        )        if (c === undefined) throw `无法在插入 ${JSON.stringify(cpt)}`        insert((c.children ??= []), cpt, level + 1)    }    return arr}const newChapters = chapters.reduce<Chapter[]>((p, c) => insert(p, c), [])
陆晓博
2024-02-27

因为你的数组是按照level有序排列的,所以可以直接遍历

function createTreeByList(arr, res = []) {    let parents = []    arr.forEach(item => {        let pindex = parents.findLastIndex(parent => +parent.level < +item.level)        if(pindex < 0){            res.push(item)        }else{            let parent = parents[pindex]            parent.childs = parent.childs || []            parent.childs.push(item)        }        parents.length = pindex + 1        parents.push(item)    })    return res}Chapters = aaa(Chapters)
 类似资料:
  • 问题内容: 我有一种方法可以为从API请求调用中接收到的对象列表计算营养素。 该方法如下所示: 我的FoodNutritional.class看起来像: 我的方法解决方案可行,但我开始考虑是否有可能摆脱这种流方法的样板。 我要实现的是汇总单个字段:,,和,并将它们作为新对象的components字段返回。 我将很高兴为您提供有关如何提高当前版本代码质量的建议。 编辑: 在周末,我花了一点时间找到一

  • 我有一个带有键值对的an数组,数组列是id和Name。我想按ID对这个数组进行排序。 id列值的类型是string类型,但我希望将它们排序为数值。

  • 有个以下格式的省市区数组对象: 请问如何用Ts变为以下格式的二维数组?

  • 我试图将以下TSV数据解析为嵌套对象,但我的“标题”字段在嵌套类中始终为空。 我已经在底部包含了将TSV数据转换为对象的方法。

  • 我正在做一个课程项目飞行雷达模拟器。 情况是,当两架飞机危险地接近时,两架飞机的图像都发生了变化,而当它们处于安全距离时,它们又发生了变化。 问题是,大多数时候,只有一个图像被改成红色,我不知道问题出在哪里。

  • 各位大佬,我想请问一下我想通过一个数组对象处理另外一个数组对象。生成一个新的数组对象要怎么处理?我想通过两个时间的字段做判断,给新生成的数组对象里面属性的值加上一个1。怎么写都不对。生成的都是有问题的。 通过的数组对象 想要处理的数组对象 我的思路有问题想不出来了,写的代码不对生成的有问题。 我希望的是生成新的数组对象,合并同名,并且根据thisDate生成新的属性。在和data这个json判断时