Obsidian 插件篇 -DataviewJS 基础知识

来源

  • 触发点:dataview 模式不足以应对需求,继续学习 dataviewjs
  • 首次记录:2025-03-08
  • 作者:huan

洞见

学习DataviewJS基础知识,便于后面进行脚本测试编写。原文地址:Obsidian插件篇-DataviewJS基础知识

详情

📌 提示:本文中的所有代码块均使用 javascript 作为语言标识,以避免本地自动执行。若要在你的 Obsidian 中运行,请将代码块的标识从 ```js 改为 ```dataviewjs

检索页面

  • dv.pages() 用于根据标签、路径或查询条件获取一组页面对象;
dv.pages("#books") //返回所有带有标签 books 的页面
dv.pages('"folder"') //返回所有在 folder 文件夹的页面
dv.pages("#yes or -#no") //返回所有带有标签 yes 或者没有标签 no 的页面
dv.pages("") //返回所有页面
  • dv.pagePaths() 则只返回这些页面的路径;
dv.pagePaths("#books") //返回所有带有标签 books 的页面路径
dv.pagePaths('"folder"') //返回所有在 folder 文件夹的页面路径
dv.pagePaths("#yes or -#no") //返回所有带有标签 yes 或者没有标签 no 的页面路径
  • dv.page() 用于获取单个页面。
dv.page("Index") //返回名称为 Index 的页面

渲染内容

DataviewJS 提供了简单的渲染函数,用于在笔记中动态生成标题或段落。

  • dv.header(level, text) 渲染指定层级的标题(1~6),其中 level 为层级,text 为文本。
dv.header(2, "这是二级标题")
  • dv.paragraph(text) 用于渲染为段落,你可以理解成普通文本。
dv.paragraph("这是一段普通文本。"

生成列表

使用 dv.list() 可将数组或页面字段渲染为 Markdown 列表。

dv.list([1, 2, 3]) //生成一个1,2,3的列表
dv.list(dv.pages().file.name)  //生成所有文件的文件名列表
dv.list(dv.pages().file.link)  //生成所有文件的文件链接列表,即双链
dv.list(dv.pages("").file.tags.distinct()) //生成所有标签的列表
dv.list(dv.pages("#book").where(p => p.rating > 7)) //生成在标签 book 内所有评分大于 7 的书本列表

任务列表

dv.taskList(tasks, groupByFile) 用于渲染任务(待办事项),当 groupByFile 为 True 或者 1 的时候,会按照文件名分组。

 
// 获取4.Apply文件夹下所有未完成任务
dv.taskList(dv.pages('"4.Apply"').file.tasks.where(t => !t.completed))
 
// 显示所有 project 标签页面中的未完成任务
dv.taskList(dv.pages("#project").file.tasks.where(t => !t.completed))
 
// 显示 project 标签页面中包含 #tag 文本的任务
dv.taskList(dv.pages("#project").file.tasks.where(t => t.text.includes("#tag")))
 
// 显示所有包含 `exam` 且未完成的任务,并按文件分组(`groupByFile = 1`)
dv.taskList(
    dv.pages("").file.tasks
    .where(t => t.text.includes("exam") && !t.completed),1)

生成表格

使用 dv.table(headers, rows) 可创建结构化表格,headers 为表头数组,rows 为每行数据的数组。

  • 展示所有 #Obsidian 标签页面的标题与自定义 id 字段:
dv.table(
	["Title", "id"],
	dv.pages("#Obsidian").map(b => [b.file.link, b.id])
)
  • 按评分排序,展示 #book 页面的书名、类型、阅读时间和评分:
dv.table(
  ["File", "Genre", "Time Read", "Rating"],
  dv.pages("#book")
    .sort(b => b.rating)
    .map(b => [b.file.link, b.genre, b["time-read"], b.rating])
)

演化日志

  • v0.1 (2025-02-17):初始版本完成
  • v0.2 (2025-03-08):完善示例
  • v0.3 (2025-10-25):补充来源、洞见、演化日志,完善笔记结构;
  • v0.4 (2025-10-25):重构详情,更易于阅读

附件参考