Dataviewjs的奇技淫巧

现在用着正常了,谢谢您,辛苦了

请问大神,您文中可以实现展示各个文件夹里文件数量饼图的代码,那请问如何实现展示各个标签的笔记数量饼图呢?

```dataviewjs
let la = ""
let da = ""
let map = dv.index.tags.invMap
for(let i of map.entries())
{
	//if(i[1].size>10) {
		la += i[0].slice(1)+','
		da += i[1].size+','
	//}
}

dv.paragraph(`\`\`\`chart
type: pie
labels: [${la}]
series:
- title: none
  data: [${da}]
legendPosition: left
labelColors: true
\`\`\``);
```

如果小标签太多了可以取消那个注释,文件数大于一定数量才会显示

1 个赞


大神好,感谢您的回复,我将您的代码复制进去后,出现的是这样的图,您说“小标签太多了可以取消那个注释”,请问是哪一段呢?饼图无法出现是因为这个问题吗?抱歉我对代码一无所知。
感谢您!

就是把那两行的 // 删掉,里面的数字可以视情况改一下


感谢指导!我将参数调成了20后,可是并没有出现饼图,请问是哪里还需要调整吗?抱歉耽误您的时间了。

诶嘿,我发现了,你的data那行没有缩进,前面加两个空格就行了


感谢大神!成功了!确实是data那行没有缩进。感谢!



大佬求助,为什么我的文件夹数量会出现这个错误,感谢!

image

还有每月笔记统计,貌似也有问题。4月份和5月份的同一个日期的笔记是一样的(比如4月14日和5月14日的笔记数量都是202个),不知哪里除了问题。。。

文件数量前面有个空值可能是根目录下有文件,试一下新版的吧

```dataviewjs
let la = ""
let da = ""
for(let i of dv.pages().groupBy(p=>p.file.folder.split("/")[0]))
{
	if(i.key=='') la += "/,";
	else la += i.key + ",";
	da += i.rows.length + ",";
}

dv.paragraph(`\`\`\`chart
type: pie
labels: [${la}]
series:
- title: none
  data: [${da}]
width: 50%
legendPosition: left
labelColors: true
\`\`\``);
```
1 个赞

多谢大佬,这个问题已经解决了!

大佬,这个问题麻烦抽空看下是怎么回事吧 :rofl:@ lazyloong

抱歉抱歉,都已经忘了还有一个问题了

```dataviewjs
let y = 2022
let m = Array(12).fill(0).map((v,i)=>{return i});
let d = [31,29,31,30,31,30,31,31,30,31,30,31]

for(let i of m)
{
    let n = Array(d[i]).fill(0).map((v,i)=>i+1);
    let a = Array(d[i]).fill(0);

    for(let j of dv.pages(`""`)
        	.filter(p=>moment(Number(p.file.cday)).year()==y
                    && moment(Number(p.file.cday)).month()==i)
        	.groupBy(p=>moment(Number(p.file.cday)).date()))
         a[j.key-1] = j.rows.length;
    
    if(a.every(p=>p==0))
        continue
    dv.header(4, i+1+"月");
    dv.paragraph(`\`\`\`chart
type: line
labels: [${n}]
series:
- title: 200-笔记
  data: [${a}]
labelColors: true
\`\`\``)
}
```

这样看看能不能成吧,dv.pages("") 这个里面可以填特定文件夹的

1 个赞

可以了,多谢大神! :smiley:

ob不愧是前端训练营 :laughing:

我想在dataview中对task做汇总,需要按日记的名字做日期判断,file.name格式是年-月-日_星期,有办法舍弃星期吗?我想只保留年月日然后转换成date做日期比较。
代码是这样的:

TASK from "日记" 
WHERE date(file.name) > date("2022-06-06") - dur(1 month) and date(file.name) < date("2022-06-06") and !completed and due <date("2022-06-06")

因为笔记会提前创建,file.cday是不准确的,file.name中的日期是准确的,但是是"2022-06-06_周一"的格式,不能同正常日期比较,所以想把星期一去掉。有没有类似file.name.substring(0,10)的函数可用哪?或者dataviewjs能不能实现类似的功能?我是在Templater中使用的

嗯,我查了下文档,在dataview中的字符串处理函数只有匹配,替换和大小写转换,我对dataview也不太熟练,这第二句的条件着实没看懂:rofl:,不然用dataviewjs应该可以解决。

我的目的是这样的,如果笔记的日期是2022年6月6号,那么就筛选2022年6月6号前一个月内未完成的任务,如果任务有due日期的话,due日期也需要在2022年6月6号之前。
我现在是这样做的,大体可以实现但是因为笔记会提前创建,file.cday不如笔记标题日期准确,所以一直在尝试用file.name中提取出的日期替换掉file.cday:

TASK from "日记" 
WHERE file.cday > date("<% inputDate %>") - dur(1 month) and file.cday < date("<% inputDate %>") and !completed and due <date("<% inputDate %>")

在Template模板中有如下变量定义:let inputDate = tp.file.title.substring(0,10)
我的笔记标题是这个样式的“2022-06-06_周一”,因为多了"_周一"这种星期标识,导致file.name直接通过date转日期的话遇到了问题,不能同正常格式的"2022-06-06"进行日期比较。

这样就可以解决查找一个月内文件的需求了,不过我没有理解这个due日期是什么,所以没办法做出来

```dataviewjs
let files = dv.pages(`#日记`)
	.filter(p=>
		moment().subtract(1,'month') < moment(p.file.name.split('_')[0]) &&
		moment() > moment(p.file.name.split('_')[0])
	)
dv.taskList(files.file.tasks)
```