一个从 YAML 中提取信息的简单表格大致是这样的:

需要插入的代码:
```dataviewjs
const pages = dv.pages('"2. Areas/Занятие спортом/Динамика веса"')
.where(p => p.Вес && p.date)
.sort(p => p.date);
let rows = [];
let prevWeight = null;
const goal = 80;
for (let p of pages) {
const date = new Date(p.date).toLocaleDateString();
const weight = p.Вес;
let diffDisplay = "–";
let toGoal = `${(goal - weight).toFixed(1)} kg`;
if (prevWeight !== null) {
const diff = weight - prevWeight;
if (diff > 0) {
diffDisplay = `🟢 +${diff.toFixed(1)}`; // gaining weight = good
} else if (diff < 0) {
diffDisplay = `🔴 ${diff.toFixed(1)}`; // losing = bad
} else {
diffDisplay = "➖ 0";
}
}
rows.push([date, weight, diffDisplay, toGoal]);
prevWeight = weight;
}
dv.table(["📅 Date", "⚖️ Weight (kg)", "📈 Difference", "🎯 To goal (80 kg)"], rows);```
→ const pages = dv.pages(‘“2. Areas/Занятие спортом/Динамика веса”’) —— 换成你自己存放带 YAML 笔记的路径 → 把最后三个单引号字符移到新的一行
🧠 写给想更深入理解这段代码的人:
这段代码可不只是一张表格,它是 Obsidian 里的智能体重追踪器。它会显示:
-
记录日期;
-
当前体重;
-
与上一次记录相比的体重变化;
-
距离目标(比如 80 公斤)还差多少。
而且这一切都是自动完成的,不需要 Excel 或第三方应用。
dataviewjs 和普通的 dataview 有什么不同?
普通的 dataview | dataviewjs |
|---|---|
写法就像在 Excel 里一样:只用 table、sort、filter。 | 使用 JavaScript,这意味着你可以实现更复杂的逻辑:比较、计算,甚至加入情绪。 |
| 适合简单的列表和表格。 | 适合高级追踪器、计算和可视化。 |
| 无法计算数值之间的差值。 | 可以比较、计算差值,甚至根据结果输出表情符号。 |
代码逐步讲解
const pages = dv.pages('"2. Areas/Занятие спортом/Динамика веса"')
.where(p => p.Вес && p.date)
.sort(p => p.date);-
我们获取 “Weight dynamics”(体重变化) 文件夹里的所有笔记。
-
进行筛选:只要同时包含 weight 和 date 的笔记。
-
按日期排序,让记录井然有序。
let rows = [];
let prevWeight = null;
const goal = 80;-
rows—— 表格的各行数据会收集在这里。 -
prevWeight—— 我们会记住上一次的体重,用来和当前体重做对比。 -
goal—— 你的目标(比如 80 公斤)。代码会显示还差多少。
for (let p of pages) {
const date = new Date(p.date).toLocaleDateString();
const weight = p.Вес;-
从每条笔记中获取日期和体重。
-
把日期转换成易读的格式(比如“27.05.2025”)。
let diffDisplay = "–";
let toGoal = `${(goal - weight).toFixed(1)} kg`;-
diffDisplay—— 自上次以来体重发生了什么变化。 -
toGoal—— 距离目标还差多少公斤。
if (prevWeight !== null) {
const diff = weight - prevWeight;
if (diff > 0) {
diffDisplay = `🟢 +${diff.toFixed(1)}`;
} else if (diff < 0) {
diffDisplay = `🔴 ${diff.toFixed(1)}`;
} else {
diffDisplay = "➖ 0";
}
}-
比较体重:是上升了、下降了,还是没有变化。
-
并加上颜色和表情符号:
-
🟢 增重了——很好!
-
🔴 减轻了——也许你该多吃点 😅
-
➖ 没变化——很稳定!
-
rows.push([date, weight, diffDisplay, toGoal]);
prevWeight = weight;-
把所有内容添加到表格中。
-
记住当前体重,用于和下一次对比。
dv.table(["📅 Date", "⚖️ Weight (kg)", "📈 Difference", "🎯 To goal (80 kg)"], rows);-
输出一张漂亮的表格:
-
日期、
-
体重、
-
变化、
-
距离目标还差多少。
-
💥 最终效果
你会在 Obsidian 里得到一张表格,它能够:
-
计算进度;
-
显示你在哪些时候减重、哪些时候增重;
-
激励你继续坚持。
这是用于自我提升和追踪进度的绝佳工具。而且是你亲手做出来的——不用 Excel,不用其他应用,全靠 Obsidian。