Quiero crear un formato de árbol de archivos en JSON basado en otro JSON. La idea es reorganizar los datos JSON en un formato de árbol.
Tenga en cuenta que el nombre del archivo indica dónde se encuentra en el árbol.
Supongamos que tenemos este primer JSON:
{ "dir1/file3.xyz": [ 18KB, "2020-01-01 00:00:00" ], "dir1/file4.xyz": [ 18KB, "2020-01-02 00:00:00" ], "dir1/subdir1/file5.xyz": [ 18KB, "2020-01-01 00:00:00" ], "dir1/subdir1/file6.xyz": [ 18KB, "2020-01-02 00:00:00" ], "file1.xyz": [ 18KB, "2020-01-01 00:00:00" ], "file2.xyz": [ 18KB, "2020-01-02 00:00:00" ] }Quiero crear un JSON basado en el anterior en este formato:
[ directories: [ { name: 'dir1', directories: [ { name: 'subdir1', directories: [], files: [ { name: 'file5.xyz', size: '19KB', modified: '2020-01-01 00:00:00' }, { name: 'file6.xyz', size: '20KB', modified: '2020-01-02 00:00:00' } ] } ], files: [ { name: 'file3.xyz', size: '19KB', modified: '2020-01-01 00:00:00' }, { name: 'file4.xyz', size: '20KB', modified: '2020-01-02 00:00:00' } ] } ], files: [ { name: 'file1.xyz', size: '19KB', modified: '2020-01-01 00:00:00' }, { name: 'file2.xyz', size: '20KB', modified: '2020-01-02 00:00:00' } ]Gracias por tu tiempo.
Resolvimos este desafío usando la lógica del código JavaScript a continuación:
function fillWithZero(intValue){ return intValue > 9 ? intValue : '0' + intValue; } function list_to_tree(list) { var map = {}, i; var root = {}; root.text = '/'; root.value = ''; root.disabled = true; root.children = []; map['/'] = root; for (i = 0; i < list.length; i += 1) { node = list[i]; var current = {}; var d = node.date; var datestring = fillWithZero(d.getDate()) + "-" + fillWithZero(d.getMonth()+1) + "-" + d.getFullYear() + " " + fillWithZero(d.getHours()) + ":" + fillWithZero(d.getMinutes()) + ":" + fillWithZero(d.getSeconds()); current.text = node.name + ' - Size: ' + parseInt(node.size/1024) + 'KB' + ' Modified: ' + datestring; current.value = node.name; var parent = root; if (node.name.indexOf('/') > 0) { var paths = node.name.split('/'); for (j = 0; j < paths.length - 1; j += 1) { var dirId = paths[j]; var dir = map[dirId]; if (dir == null) { dir = {}; dir.text = dirId; dir.value = dirId; if(parent != root){ dir.value = parent.value + '/' + dirId; } dir.disabled = true; dir.children = []; map[dirId] = dir; parent.children.push(dir); } parent = dir; } current.text = node.name.substr(node.name.lastIndexOf('/') + 1, node.name.length) + ' - Size: ' + parseInt(node.size/1024) + 'KB' + ' Modified: ' + datestring; } parent.children.push(current); } return root; } var entries = [{ "name": "dir1/file1.xyz", "size": 4234, "date": new Date() }, { "name": "dir1/file2.xyz", "size": 4234, "date": new Date() }, { "name": "dir1/subdir1/file3.xyz", "size": 4234, "date": new Date() }, { "name": "dir1/subdir1/file4.xyz", "size": 4234, "date": new Date() }, { "name": "file3.xyz", "size": 4234, "date": new Date() }, { "name": "file4.xyz", "size": 4234, "date": new Date() } ]; console.log(list_to_tree(entries));