dataview如何传参

我想在table中生成一个num列,这个列的值是字典cards中以file.name作为键的值

问题是使用${cards[file.name]}并不能把table中file.name的值传进去(好像默认去找全局的file.name变量?)

下面是代码,求教佬们该怎么改

var output = `
table without id
	("![]("+ cover + ")") as Cover, 
	("[["+file.name+"|"+aliases+"]]") as Name,
	string(file.tags) as tags,
	(${cards[file.name]}) as num
from "BLB"
WHERE contains([${creatures.map((node)=>{return '"'+node+'"'})}],file.name)
sort file.frontmatter.mana
`;
dv.paragraph("```"+"dataview\n"+output+"\n```");

首先你要明白,你这段代码运行在dataviewjs代码块环境中,而你新增的列运行在dataview代码块环境中。

当你执行dataviewjs代码块中的代码的时候,脚本自然去找cards变量,并找当前file.name进行生成一个变量的值。而当执行到dataview代码块中时,${cards[file.name]}) 这段代码已经是一个确切的值了,即刚才的结果,而且在dataview代码块环境中也不存在cards变量。

传值也传不了,严格来说,dataview代码块中不是js环境。

建议用dv.query实现,获取数据后再进一步处理。

可参考

感谢感谢

试了一两小时,最后我是先把字典的键值对(如"dog": 1)合并为一个字符串(如"1dog"),把字典转换为一个字符串数组,在dataview中使用filter根据endswith( ,file.name)过滤出一个,再使用substring把值取出来,曲线救国了属于是哈哈哈

var output = `
table without id
	("![]("+ cover + ")") as Cover, 
	("[["+file.name+"|"+aliases+"]]") as Name,
	string(file.tags) as tags
    substring(filter([${cardsArr.map((node)=>{return '"'+node+'"'})}], (node)=>endswith(node, file.name))[0],0,1) as num
from "BLB"
WHERE contains([${spells.map((node)=>{return '"'+node+'"'})}],file.name)
sort file.frontmatter.mana
`;

dv.paragraph("```"+"dataview\n"+output+"\n```");
1 个赞