js 在已有字典中存数据_javascript 数组中循环添加字典列表
慕容大雪花楼上说的挺好的了,我从另外一个角度来说一下这个问题。其实楼主的问题暴露了命令式编程的缺点,就是你必须关心所有的实现细节,只要有一个细节不正确,程序就无法正常运行,因此不妨从声明式编程的角度重新看一下这个需求:constdata={categories:[{id:0,cname:''}],courses:[{id:0,category_id:0,coursename:''}],chapte

慕容大雪花
楼上说的挺好的了,我从另外一个角度来说一下这个问题。其实楼主的问题暴露了命令式编程的缺点,就是你必须关心所有的实现细节,只要有一个细节不正确,程序就无法正常运行,因此不妨从声明式编程的角度重新看一下这个需求:constdata={categories:[{id:0,cname:''}],courses:[{id:0,category_id:0,coursename:''}],chapter:[{id:0,courseid:0,chaptername:''}]};consttree=data.categories.map(cate=>({value:cate.id,label:cate.cname,children:data.courses.filter(cour=>cour.category_id===cate.id).map(cour=>({value:cour.id,label:cour.coursename,children:data.chapter.filter(chap=>chap.courseid===cour.id).map(chap=>({value:chap.id,label:chap.chaptername}))}))}));console.log(tree)就在控制台直接写的,可能存在问题,但是我想说的是,关于你这里的需求,其实拿map和filter来抽象的话,基本不需要考虑children这一个中间变量以及if-else的处理逻辑。这样做还有一个好处就是,可以将子逻辑抽离为独立的函数或者模块,比如:constchapterNodeMapper=chap=>({value:chap.id,label:chap.chaptername});constcourseNodeMapper=cour=>({value:cour.id,label:cour.coursename,children:data.chapter.filter(chap=>chap.courseid===cour.id).map(chapterNodeMapper)});constcategoryNodeMapper=cate=>({value:cate.id,label:cate.cname,children:data.courses.filter(cour=>cour.category_id===cate.id).map(courseNodeMapper)});consttree=data.categories.map(categoryNodeMapper);这样针对每一个节点的映射逻辑,都可以编写独立的单元测试来确保它们的正确性,甚至在映射逻辑相同的情况下,可以直接用递归的方式实现,好处多多。
更多推荐

所有评论(0)