Dataviewjs的奇技淫巧

早说嘛,dataview我不熟,这个我熟啊

```dataviewjs
let files = dv.pages(`"500_日记"`)
dv.table(['字段','数量'],files.groupBy(p=>p.字段).sort(p=>p.rows.length,'desc').map(p=>[p.key,p.rows.length]))
```
2 个赞

大佬赛高,学习了~

再加个 字段值不为空怎么写呢?

啥叫加个字段不为空,过滤空值的文件吗

是的,过滤字段值为空的文件

```dataviewjs
let files = dv.pages(`"500_日记"`)
dv.table(['字段','数量'],files.filter(p=>p.字段).groupBy(p=>p.字段).sort(p=>p.rows.length,'desc').map(p=>[p.key,p.rows.length]))
```

居然是filter(p=>p.字段),我之前写的!=Null

因为字段为空时得到的是undefined,而undefined不等于null,同时undefined在判断时隐式转换成false

大佬,我像做一个热力图来统计每天创建的笔记数,现在卡在了不知道怎么获取当日创建的笔记数量这,我想让i等于创建的笔记数要怎么操作呀?不太会JS

```dataviewjs 
// // Using multiple colors for different variations of entry // 
const calendarData = { year: 2022, colors: { blue: ["#8cb9ff","#69a3ff","#428bff","#1872ff","#0058e2"], // first entry is considered default if supplied 
	green: ["#c6e48b","#7bc96f","#49af5d","#2e8840","#196127"],
}, 
	entries: []
}
for(let page of dv.pages('"要统计的文件夹"')){
	let color = "green" 
	let i = "当天创建的笔记数" 
	calendarData.entries.push({ 
		date: page.file.cday, 
		color: color, i
		intensity: i,
	})
} 

renderHeatmapCalendar(this.container, calendarData) 
```dataviewjs 
// // Using multiple colors for different variations of entry // 
const calendarData = { year: 2022, colors: { blue: ["#8cb9ff","#69a3ff","#428bff","#1872ff","#0058e2"], // first entry is considered default if supplied 
	green: ["#c6e48b","#7bc96f","#49af5d","#2e8840","#196127"],
}, 
	entries: []
}

for(let page of dv.pages('"200-主笔记"').groupBy(p=>moment(Number(p.file.cday)).format('YYYY-MM-DD'))){
	calendarData.entries.push({ 
		date: page.key, 
		color: "green",
		intensity: page.rows.length,
		content: page.rows.length
	})
} 

renderHeatmapCalendar(this.container, calendarData)
```
2 个赞

谢谢大佬还回复我,但很尴尬的是,我没有成功得到我想要的功能 :joy:

我是想像这位作者那样制作一个能跟踪自己每天产出笔记数量的热力图

我将大佬的代码复制进Obsidian中没有得到想要的结果,希望大佬可以帮帮我实现这个功能,太感谢您了~

啊,为什么,哪里出问题了吗


用大佬给的代码生产成的热力图是没有标记的,很奇怪…
感觉好像date并没有识别出page.key的日期,显示不正确。

你不修改一下文件夹名吗,还是你也有名叫 200-主笔记 的文件夹

1 个赞


哇塞!成功啦!大佬太牛了,我还在奇怪为什么要用200减去主笔记呢 :joy: 不好意思,纯小白…
谢谢大佬!

非常感谢~再此基础上进行改造开发了自己想要的功能

麻烦大神,这段代码我想去掉“and #日记”这个条件,实现表格形式汇总小标题下内容,但尝试了一下,会报错。

实在不懂代码,希望大神指点。

噢,这段代码有bug,如果没有对应标题就会出错

```dataviewjs
const term = "日常记录"
const files = dv.pages(`"600-日常"`).sort(p=>p.file.name)
let a = []
for(let i of files) {
    let x = await app.vault.readRaw(i.file.path);
    x = x.split(/^#+ /m).find(p=>p.startsWith(term));
    if(!x) continue
    a.push([i.file.name, x.split('\n').slice(1).join('\n')])
}
dv.table(['文件名', term],a)
```

不过有个更好的代码在这
关于日记自定义日期文件名、代办任务排序、内容聚合等问题 - 疑问解答 - Obsidian 中文论坛

非常完美,谢谢:pray:

感恩,大佬这种二次渲染的做法真的给了好多灵感,js小白一点点看例子东平西凑弄了一个每日创建文件的热力图(排除日志),也贴出来抛砖引玉一下

dv.span("### **🗄️ 每日创建文件 🗄️**")
const calendarData = { 
	year: 2023, 
	intensityScaleStart: 0,
    intensityScaleEnd: 10,
	colors: { 
		green: [
            "hsl(65, 83%, 88%)",
            "hsl(70, 77%, 78%)",
            "hsl(80, 62%, 72%)",
            "hsl(95, 52%, 66%)",
            "hsl(112, 45%, 61%)",
            "hsl(125, 43%, 56%)",
            "hsl(132, 41%, 49%)",
            "hsl(132, 45%, 43%)",
            "hsl(132, 49%, 36%)",
            "hsl(132, 54%, 29%)", 
            "hsl(132, 59%, 24%)",
        ]
	}, 
	entries: [] 
} 

for(let page of dv.pages('"Periodic Note"')){ 
	let color = "green" 
	let intensity = dv.pages('!"Periodic Note"').where(p =>p.file.cday.toISODate()==page.file.name).file.array().length
// 排除日志,这样有日志而未创建文件会显示为0,而无日志直接不显示(默认只要有工作当天必有日志)

	calendarData.entries.push({ 
		date: page.file.name, 
		color: color, 
		intensity: intensity,
		content: await dv.span(`[${intensity}](${page.file.name}.md#🗄️%20当天创建的文件清单)`),
		// 预览修改为段落引用
	}) 
} 

renderHeatmapCalendar(this.container, calendarData)