使用Javascript对嵌套JSON中的索引进行排序
如何递归地将排序键添加到无限层次结构中,如下所示:使用Javascript对嵌套JSON中的索引进行排序,javascript,json,sorting,nested,Javascript,Json,Sorting,Nested,如何递归地将排序键添加到无限层次结构中,如下所示: [ { "id": "D41F4D3D-EA9C-4A38-A504-4415086EFFF8", "name": "A", "parent_id": null, "sortNr": 1, "children": [ { "id": "07E556EE-F66F-49B5-B5E4-54AFC6A4DD
[
{
"id": "D41F4D3D-EA9C-4A38-A504-4415086EFFF8",
"name": "A",
"parent_id": null,
"sortNr": 1,
"children": [
{
"id": "07E556EE-F66F-49B5-B5E4-54AFC6A4DD9F",
"name": "A-C",
"parent_id": "D41F4D3D-EA9C-4A38-A504-4415086EFFF8",
"sortNr": 3,
"children": []
},
{
"id": "8C63981E-0D30-4244-94BE-658BAAF40EF3",
"name": "A-A",
"parent_id": "D41F4D3D-EA9C-4A38-A504-4415086EFFF8",
"sortNr": 1,
"children": [
{
"id": "0BA32F23-A2CD-4488-8868-40AD5E0D3F09",
"name": "A-A-A",
"parent_id": "8C63981E-0D30-4244-94BE-658BAAF40EF3",
"sortNr": 1,
"children": []
}
]
},
{
"id": "17A07D6E-462F-4983-B308-7D0F6ADC5328",
"name": "A-B",
"parent_id": "D41F4D3D-EA9C-4A38-A504-4415086EFFF8",
"sortNr": 2,
"children": []
}
]
},
{
"id": "64535599-13F1-474C-98D0-67337562A621",
"name": "B",
"parent_id": null,
"sortNr": 2,
"children": []
},
{
"id": "1CE38295-B933-4457-BBAB-F1B4A4AFC828",
"name": "C",
"parent_id": null,
"sortNr": 3,
"children": [
{
"id": "D1E02274-33AA-476E-BA31-A4E60438C23F",
"name": "C-A",
"parent_id": "1CE38295-B933-4457-BBAB-F1B4A4AFC828",
"sortNr": 1,
"children": [
{
"id": "76A8259C-650D-482B-91CE-D69D379EB759",
"name": "C-A-A",
"parent_id": "D1E02274-33AA-476E-BA31-A4E60438C23F",
"sortNr": 1,
"children": []
}
]
}
]
}
]
我想得到一个可排序的索引。
例如,节点A-C的0000.0001.0003
或0001.0003
引线零的功能是
function fillZeroes (num) {
var result = ('0000'+num).slice(-4);
if (num===null){
return result
} else {
return '0000';
}
}
它应该按照层次结构的每个级别中的排序号进行排序,每次都应该重新设置排序号,因为我想通过将其设置为1,5来进行重新排列,以将其插入到1和2之间(稍后用于拖放功能)。so1;1,5;2
应变为1;2.3
,然后可以转换为如上所述的排序索引
我还需要它的压痕和面包屑的东西
如何向每个对象插入适当的排序索引
问题主要是关于递归部分。我对JavaScript还很陌生
非常感谢基本上
let renumber = (obj, path) => {
obj.path = path
obj.children.forEach((c, n) => renumber(c, path.concat(n)))
}
renumber({children: yourData}, [])
这将创建一个path
属性,该属性是一个相对数数组。如果您想以一种特殊的方式格式化它,那么您可以这样做
obj.path = format(path)
其中格式
类似
let format = xs => xs.map(pad(4)).join(',')
let pad = w => x => (10 ** w + x).toString().slice(-w)
基于@georg的精彩回答。基于
sortNr
对象属性的位调整解决方案。
使用json
作为对象,您可以直接运行它。排序索引写入sortOrder
属性
//在适当位置对给定对象进行变异。
//将sortOrder属性指定给每个嵌套对象
常量索引json=(json)=>{
const obj={children:json};
常量格式=(xs)=>xs.map(x=>pad(x,4)).join('.');
常数pad=(x,w)=>(10**w+x).toString().slice(-w);
常量重新编号=(对象,路径)=>{
obj.path=路径;
obj.sortOrder=格式(路径);
obj.children.slice()
.sort((obj1,obj2)=>obj1.sortNr-obj2.sortNr)
.forEach((c,n)=>重新编号(c,path.concat(n+1));
};
重新编号(obj,[]);
};
indexJson(json);
log(JSON.stringify(JSON,null,2));
的可能重复项您能否澄清1,5
-您的意思是sortNr
属性可以是浮点数?@danilandreyevichbaunov。如果JSON中只支持整数,我将使用2,4,6作为1,2,3的表示形式,并使用奇数“insert”。@nch68,我明白了。所以,总而言之,正如我所理解的,您希望将排序索引基于sortNr属性。并使其致密,例如,单个级别内1,5,5.5,6
的sortNr
将类似于000100002,0003,0004
。对吗?顺便说一句,@georg给出的答案是非常需要。只需要针对您的用例进行一些调整。@Danilandreyevichbaunov完全正确。@nch68,如果答案有帮助,请向上投票。在这里,这是一种感谢。我不能,因为我的声誉不到“15”:/