首页 > 解决方案 > CFML/JS 从普通 SQL 创建嵌套的 JSON/数组

问题描述

我想从一个普通的 json 数组构建一个树结构。常规深度约为。6/7(最多 10 条),大约有 5,000 条记录。我的输入 json 看起来像这样

[3,"01","GruppenAnfangHook",1,0,1,0,"Installationsmaterial",1.0,"",null,null,0.0,-1.0,null,803.0300,803.0300,0.00000,1,1]
[5,"01.001","JumboAnfangHook",3,0,3,0,"MBS Wandler 1.000",6.0,"St",null,null,0.0,-6.0,0.0000,336.7800,56.1300,0.00000,2,2], 
[38,"","ArtikelHook",3,5,3,0,"ASK 61.4 1000/5A 5VA Kl.1 Preis lt. Hr. K am 16.05.17",6.0,"stk",6.0,6.0,0.0,-6.0,null,21.5000,21.5000,0.00000,3,3]

但我需要像这样的孩子

 {"0":34,1":"02.003",2":"JumboBegin","3":26,"4":0, "5":26,"6":0, "children":[
     {  "0":36,"1":"", "2":"Article","3":26,"4":34,"5":26,6:"0", 7: "Artikel"},
     {  "0":35,"1":"", "2":"JumboEnd",3":26,"4":34, "5":26, 6:"0",7:"Stunde"}
 ]}

到目前为止,我最好的方法是在前端使用以下 JS 函数构建子结构

function nest(data, parentId = 0) {
return data.reduce((r, e) => {
    let obj = Object.assign({}, e)
    if (parentId == e[4]) {
        let children = nest(data, e[0])
        if (children.length) obj.children = children
        r.push(obj)
    }
  return r;
}, [])}

它运行良好且快速(< 1s),记录量很少(<500),但我的浏览器开始冻结在 2,000 及以上。

我的想法是数据太多,所以我尝试在 CFML 后端解决它。由于我是递归新手,Ben Nadels 博客帮助了我很多,所以我使用了他关于递归的帖子,并使用示例数据创建了一个工作示例

q = queryNew("id,grpCol,jumCol,leiCol,name,typ,order");

grpCol 是 0 级,最多可以放置 5 个组,在这些组中可以放置两种容器(jumCol 和 leiCol),它们可以彼此放置,但不能放置在它们自己中。

但是现在我无法将其转换为具有子成员的结构数组。示例中作为输出生成的 HTML 树的结构正是我想要的前端 JSON 的结构。由于我没有得到递归,如何将它存储在函数外部的数组中。我的目标是最终返回 serzializeJson(array)。

标签: jsontreecoldfusionnestedcfml

解决方案


推荐阅读