Dataviewjs的奇技淫巧

你应该会基础的检索功能吧,dv.pages(``)里填的和dataview功能的from是一样的东西

let files = dv.pages(`"100-Index/150-卡片"`)
dv.table(
	['文件','内容'],
	await Promise.all(files.map(async(p)=>{
	let c=await app.vault.readRaw(p.file.path)
	return [p.file.link,c]}))
)
1 个赞

感谢大佬,不过有点卡,可能是因为我的文件数量太多了(63个)。我在琢磨一下看看有没有别的办法吧,感觉聚合大量内容太难了

有点卡啊,那这样呢

let files = dv.pages(`"100-Index/150-卡片"`)
dv.table(
	['文件','内容'],
	await Promise.all(files.map(async(p)=>{
	let c=await app.vault.cachedRead(app.vault.getAbstractFileByPath(p.file.path))
	return [p.file.link,c]}))
)

奇怪,我测试了一下,另一个145个文件的文件夹不卡,而这个64的贼卡。我先排除一下看看是不是这个文件夹里面哪个文件有问题

哦,我知道了,我用了folder note,然后我在这个文件夹的folder note里面启用了这个dataviewjs,然后结果就是我想显示这个文件夹下的所有文件的话,会把folder note这个页面也显示进去,循环往复越来越卡 :sweat_smile:换个地方显示就好了,感谢大佬 :laughing: :laughing: :laughing:

大佬,刚忽然有个想法,不知道能不能实现。下面是我自己写的读书笔记统计,有没有办法,点击下面的图片跳转笔记呢?默认只能点击图片上面的标题才能跳转,点击图片就变成了看源码了,这么大的空间白白浪费了。附上代码:

[!success]+ 已读

Table
(“![|50](” + cover + “)”) as “封面”, author as “作者”,updated as “修改”
From “1.索引/Book”
Where icontains(status,“已读”)
sort updated desc

这个比较麻烦,插件里基本没有直接的功能实现,但是可以用前端的方法硬凑出来。

let files = dv.pages(`"1.索引/Book"`).filter(p=>p.status.includes('已读'))
let m=files.map(p=>{
let a=dv.paragraph("![|50](" + p.cover + ")")
a.onclick=(e)=>{
if(e.ctrlKey)
app.workspace.getLeaf('tab').openFile(app.vault.getAbstractFileByPath(p.file.path))
else
app.workspace.getMostRecentLeaf().openFile(app.vault.getAbstractFileByPath(p.file.path))
}
return [a,p.author,p.updated]
})
dv.table(['cover','a','u'],m)

我用dataviewjs运行出现下面的错误提示


用dataview出现下面的错误提示,我也搞迷糊了

下面这是我其中一个读书笔记的文档属性,不知道有没有关系

第一行后面换成这样p.status?.includes试试

成功了!!!大佬你这水平我感觉都可以开个课去卖,完全没得问题 :+1:

大神,如果我想要dataviewjs,在一个不确定文件夹下面,获取出所有的未完成任务列表(不包含有些是空的任务),获取出的列表要有链接,请问可以实现么?

啥叫不确定文件夹,都不确定是哪个文件夹怎么获取

我会定义一个文件夹,const一下,主要是获取不包含空值,并且列表要有链接,这里一直搞不定

确定是列表吗,dvjs获取的任务自带链接,但是单纯的列表没有,需要一点花活

我自己获取出来的任务,都带上了note的名字,我就只需要单纯把所有任务,直接排列就好了,不需要note的名字

const folder = ''
let files = dv.pages(`"${folder}"`)
dv.taskList(files.file.tasks.filter(p=>!p.completed && p.text!=''))
1 个赞

我尝试了一下一个简单的方法,不需额外的代码实现。只需要把dataview的代码换成:

("[![|50]("+cover+ ")](<"+file.name+">)") as "封面"

ob自动把[](文件名)识别成内链,且()内容不显示,dataview刚好可以给到file.name参数。

1 个赞

大佬太强了,学到好多)
我有一个需求是汇总所有日记(全部放在"02-Daily Notes"文件夹内)中指定二级标题下的所有三级标题。比如对于某日记date.md如下:

## [[Project 1]]
### job 1
...
### job 2
...

## [[Project 2]]
### work 1
...
### work 2
...

我希望当我给定Project 1,能够仅提取job 1和job 2(不包括其他正文和次级标题内容),最后能汇总到类似下面格式的表格中:

文件名            job

date.md        - job 1
               - job2

date2.md       -job
...

看了很多帖子感觉dataviewjs是可以实现的,但大概是自己前端实在太菜,别人的代码拿来一改就不行了TUT,折腾了好多天都没什么结果,还望大佬赐教)

dataviewjs确实可以实现,要放在以前,我肯定会用正则硬去匹配标题,但是现在我发现ob其实可以直接获取文件对应的标题 :joy:

let files = dv.pages(`"02-Daily Notes"`)
let targetHeader = '[[Project 1]]'
let headers = files.map(p => {
		let tf = app.vault.getAbstractFileByPath(p.file.path)
		let header = app.metadataCache.getFileCache(tf)
			.headings
		if (!header) return
		let h = []
		let b = false
		for (let i of header) {
			if (b && i.level == 3) h.push(i.heading)
			if (b && i.level == 2) b = false
			if (i.heading == targetHeader && i.level == 2) b = true
		}
		return h.length == 0 ? false : [p.file.link, h]
	})
	.filter(p => p)
dv.table(['file', 'headers'], headers)
1 个赞

啊确实,我就是一直在改正则,出各种问题……原来可以提取出来,多谢大佬!