Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Javascript对嵌套JSON中的索引进行排序_Javascript_Json_Sorting_Nested - Fatal编程技术网

使用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之间(稍后用于拖放功能)。so
1;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”:/