【问题标题】:Sort tree structured object by another object按另一个对象排序树结构对象
【发布时间】:2021-11-14 22:17:45
【问题描述】:

我有以下未排序的文件结构:

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}
]

我想根据另一个输入对象(它是一个简单的书签结构对象)按 files.info.name 对这个未排序的文件树对象进行排序,如下所示:

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: [] 
      }
    ]
  }
]

到目前为止,我有以下内容,但我认为这不会通过每个级别。

  // 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);
      });

}

【问题讨论】:

    标签: javascript typescript sorting


    【解决方案1】:

    使用递归函数

    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;
    }
    

    【讨论】:

    • 谢谢,成功了!
    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多