Javascript:解析平面json结构并将其排序为嵌套数组?

Javascript:解析平面json结构并将其排序为嵌套数组?,javascript,recursion,underscore.js,nested-lists,Javascript,Recursion,Underscore.js,Nested Lists,我从简单的JSON输入开始(简单示例): 输入可以具有任意深度和长度,需要根据父子关系重新格式化为嵌套数组的集合,并在每个嵌套级别按升序排序 可以使用本机JS或下划线JS格式化输出 输出将被格式化为json结构,基本形式如下: root1 child1 child2 root2 child1 child1 child2 child2 etc... 其中每个元素都是一个JSON对象 嵌套深度可以是任何内容,因为数据很可能来自具有上述平面结构的db表 有什么

我从简单的JSON输入开始(简单示例):

输入可以具有任意深度和长度,需要根据父子关系重新格式化为嵌套数组的集合,并在每个嵌套级别按升序排序

可以使用本机JS或下划线JS格式化输出

输出将被格式化为json结构,基本形式如下:

root1 
  child1
  child2
root2
  child1
    child1
    child2
  child2

  etc...
其中每个元素都是一个JSON对象

嵌套深度可以是任何内容,因为数据很可能来自具有上述平面结构的db表


有什么想法吗

我将按如下方式完成这项工作。我本可以使用
属性来附加嵌套对象,但此时问题还不清楚。相反,我创建了
子属性
来构造嵌套结构

var扁平=[
{id:1,值:'child1',parentId:2,sortOrder:1},
{id:2,值:'root1',parentId:null,sortOrder:1},
{id:3,值:'root2',parentId:null,sortOrder:2},
{id:4,值:'child2',parentId:1,sortOrder:2},
{id:5,值:'root3',parentId:null,sortOrder:3},
{id:6,值:'child1',parentId:2,sortOrder:1},
{id:7,值:'root4',parentId:null,sortOrder:4}
],
lut=扁平排序((a,b)=>a.sortOrder-b.sortOrder)
.reduce((t,o)=>{o.children==void 0&&(o.children=[]);
t[o.id]=t[o.id]==void 0?o:(o.children=t[o.id]。children,o);
o、 parentId!==null&&
(t[o.parentId]!==void 0?t[o.parentId]。children.push(o)
:t[o.parentId]={id:o.parentId,子项:[o]};
返回t;
},{}),
nested=Object.keys(lut).reduce((a,k)=>lut[k].parentId==null?a.concat(lut[k]):a,[]);

console.log(嵌套)
我们的计划是将父项下的子项移动到一个新的数组值
children
属性中,然后将它们过滤掉

const flat=[
{id:1,值:'child1',parentId:2,sortOrder:1},
{id:2,值:'root1',parentId:null,sortOrder:1},
{id:3,值:'root2',parentId:null,sortOrder:2},
{id:4,值:'child2',parentId:1,sortOrder:2},
{id:5,值:'root3',parentId:null,sortOrder:3},
{id:6,值:'child1',parentId:2,sortOrder:1},
{id:7,值:'root4',parentId:null,sortOrder:4}
];
const nested=flat.filter((elt、idx、arr)=>{
const parent=arr.find(e=>e.id==elt.parentId);
如果(!parent)返回true;
(parent.children=parent.children | |[]).push(英语教学);
});

console.log(嵌套)为我提供了完成此任务所需的一切。请了解什么是JSON,什么不是JSON。有什么想法吗?是的,我的想法是,你需要编写一个“计算机程序”来完成这项工作。我当然希望我永远不必维护这些代码。
root1 
  child1
  child2
root2
  child1
    child1
    child2
  child2

  etc...