Tengo la siguiente estructura de archivos sin ordenar:
const files: File[] = [ {info: {name: "Part 3"}, contents: [ {info: {name: "05 Chapter"}, contents: [], isHidden: false}, {info: {name: "10 Chapter"}, contents: [], isHidden: false}, {info: {name: "03 Annex"}, contents: [], isHidden: false} ], isHidden: false }, {info: {name: "Part 1"}, contents: [ {info: {name: "05 Chapter"}, contents: [], isHidden: false}, {info: {name: "10 Annex"}, contents: [], isHidden: false}, {info: {name: "03 Chapter"}, contents: [], isHidden: false} ], isHidden: false} ]Me gustaría ordenar este objeto de árbol de archivos sin clasificar por files.info.name en función de otro objeto de entrada (que es un objeto estructurado de marcador simple) que se ve así:
const bookmark = [ { part: "Part 1", chapters: [ { name: "03 Annex", chapters: [] }, { name: "05 Chapter", chapters: [] }, { name: "10 Chapter", chapters: [] } ] }, { part: "Part 3", chapters: [ { name: "03 Chapter", chapters: [] }, { name: "05 Chapter", chapters: [] }, { name: "10 Annex", chapters: [] } ] } ]Tengo lo siguiente hasta ahora, pero no creo que pase por cada nivel.
// sortFilesByBookmark sorts the files to show by a given bookmark object export function sortFilesByBookmark(files: File[], bookmark){ files.sort(function(a, b){ return bookmark.indexOf(a.info.name) - bookmarkArray.indexOf(b.info.name); }); }Usar una función recursiva
interface XFile { info: { name: string }; isHidden: boolean; contents: XFile[]; } interface Bookmark { // You should consider naming `part` & `name` the same part?: string; name?: string; chapters: Bookmark[]; } export function sortFilesByBookmark(files: XFile[], bookmarks: Bookmark[]): XFile[] { // Sort file as bookmarks const sorted = files.sort((a, b) => { return bookmarks.findIndex(x => a.info.name === (x.part || x.name)) - bookmarks.findIndex(x => b.info.name === (x.part || x.name)); }) // Nest sort sorted.forEach((f, ix) => { const bk = bookmarks.find(x => f.info.name === (x.part || x.name)); f.contents = sortFilesByBookmark(f.contents, bk.chapters); }) return sorted; }