```dataviewjs // Load script extensions eval( (await app.vault.read(app.vault.getAbstractFileByPath("dataviewjs/extensions.md"))) .replace(/^```js/g, "").replace(/```$/g, "") ); await window.extensions.loadExtension("books"); const remCategory = "Остальное"; const books = window.books.getAll().sort(book => book.file.cday, "desc"); let booksByCategories = {}; booksByCategories[remCategory] = []; for (const book of books.values) { if (book.Категории) { for (const category of book.Категории) { if (!(category in booksByCategories)) { booksByCategories[category] = []; } booksByCategories[category].push(book); } } else { booksByCategories[remCategory].push(book); } } // https://stackoverflow.com/a/31102605 const booksByCategoriesOrdered = Object.keys(booksByCategories).sort().reduce( (obj, key) => { obj[key] = booksByCategories[key]; return obj; }, {} ); for (const [category, categoryBooks] of Object.entries(booksByCategoriesOrdered)) { if (categoryBooks.length == 0) continue; dv.header(2, `${category} (${categoryBooks.length})`); dv.el("div", window.books.renderBooks(categoryBooks), {cls: ["books"]}); } ```