【已解决】如何用 DataviewJS 聚合标签

通过dataviewjs,在文件页显示所有标签,如图:

但这样没有换行,我想将每个一级标签分段分开来,一段(横排)显示一个一级标签下面的所有标签。

记得以前看到过别人的分享,但是现在找不到了。论坛内也看到有大佬分享,但他提供的最后效果是竖着的,有点占空间。
求助:pray:

是这种效果吗?

建议把自己想要的效果画出来或文字打个样式出来看看长啥样的?千言万语不如一张图。

另外,建议涉及到代码莫截图,用`包裹,不然英文引号会变成中文引号等意外。


大佬好,感谢建议和分享!
想实现的效果如图,跟您的思路是一样的,不过您的效果是竖排的,不知道能否变成图中这样的横排?

遍历一次,一级标题 a 在字典 all 中增加一个映射 all[‘a’] = ,不是一级标签就直接找字典 all 是否有这个一级标签 ‘b/b1’,没有就 all[‘b’] = [‘b/b1’] 有就 all[‘b’].append(‘b/b2’)

不会 dvjs 的话丢个 gpt 让他写个 dvjs 然后改改就行

你 这样,如果没有子级就变成竖排一列了,是这个意思吗,比如

#社会 #社会/老龄化 ......
#天文
#地理
#obsidian
#其他
......

是的,就是这个意思!

感谢回答~但是我不是学计算机的,不是很懂 :joy:

既然这样的话,把我之前的代码改下就行了

```dataviewjs
// 获取所有tags
let tags = app.metadataCache.getTags();
//是否区分大小写,true区分,false不区分
const isCaseSensitive = true;
const tree = {};
// 按嵌前缀排序
const sortByPrefix = (arr) => {
    return arr.sort((a, b) => {
        // 分割字符串获取前缀
        const prefixA = a.split('/')[0];
        const prefixB = b.split('/')[0];
        
        // 比较前缀
        if (prefixA !== prefixB) {
            return prefixA.localeCompare(prefixB); // 按照前缀字母顺序排序
        } else {
            // 如果前缀相同,则比较整个字符串
            return a.localeCompare(b);
        }
    });
}
// 按前缀排序
tags = Object.keys(tags);
tags = sortByPrefix(tags);

// 输出标签内容
let content = "";
let lastTagPrefix = "";
tags.forEach(item => {
	const itemPrefix = item.split("/")[0];
	if(itemPrefix !== lastTagPrefix){
	    if(lastTagPrefix !== "") content += "\n\n";
		lastTagPrefix = itemPrefix;
	}
	content += item + " ";
});
dv.el("div", content);
```

1 个赞

哇!太感激了!对我帮助很大,感谢大佬相助~

能设定指定文件夹么

指定文件夹可以改成这样

```dataviewjs
// 指定文件夹 这里改成 👇 你的文件夹名
const filter = `"your folder"`;

// 获取所有tags
let tags = [];
dv.pages(filter).map(p=>p.file.tags.values.forEach(tag=>tags.push(tag)));
// 去重
tags = [...new Set(tags)];
// 按嵌前缀排序
const sortByPrefix = (arr) => {
    return arr.sort((a, b) => {
        // 分割字符串获取前缀
        const prefixA = a.split('/')[0];
        const prefixB = b.split('/')[0];
        
        // 比较前缀
        if (prefixA !== prefixB) {
            return prefixA.localeCompare(prefixB); // 按照前缀字母顺序排序
        } else {
            // 如果前缀相同,则比较整个字符串
            return a.localeCompare(b);
        }
    });
}
// 按前缀排序
tags = sortByPrefix(tags);

// 输出标签内容
let content = "";
let lastTagPrefix = "";
tags.forEach(item => {
	const itemPrefix = item.split("/")[0];
	if(itemPrefix !== lastTagPrefix){
	    if(lastTagPrefix !== "") content += "\n\n";
		lastTagPrefix = itemPrefix;
	}
	content += item + " ";
});
dv.el("div", content);
```

这个代码我试了非常好,非常感谢 :pray: 不过显示的标签是每行一个的,怎么才能在一行里面连续排列显示呢?由于没有代码基础,研究了半天楞是没弄出来,希望大神能帮编辑下代码,非常非常感谢