How to NOT show a specific group with DataviewJS

What I’m trying to do

I’m using Obsidian to organize my podcast and without going into too many needless details, I have a note for video game characters to show what episodes exist with those characters broken down by various categories that are defined in the YAML frontmatter and Dataviewjs to make groups of tables for those categories.

One of those categories is “Also Has Games With” and I can get that list and grouping to populate correctly except for the part where I also have a group for the subject of the current note.

Let’s take a look at this example, which I pulled off of the Batman note.

Obviously Batman has games that feature Batman. But is there a way to just not show this Batman group while keeping everything else?

Code for My Attempt

```dataviewjs  

dv.header(2, "Also Has Games With:")
// get all published podcast episodes

let pages = dv.pages('"00 Podcast Episodes"').where(p => p.stage == "Published")
//let characters = "PlayableCharacters".where contains(PlayableCharacters, this.current().PlayableCharacters) commented out on purpose
// create group object  

let groups = dv.pages(p.consoles).where(p => p.stage == "Published" && p.Type == "Regular Episode" && p.ComicPublisher != "NA").flatMap(page => dv.array(page.PlayableCharacters).map(t => Object.assign({}, page, {Guests: t })))

.where (p => p.stage == "Published" && p.PlayableCharacters)
.where (p => p.PlayableCharacters.includes(this.current().file.name))
.where (p => p.playablecharacters != this.current().file.name)

    .groupBy(page => page.Guests); 

for (let group of groups){
	dv.header(4, group.key);
	dv.table(["Game", "EP Num"],
		group.rows
			.map(k => [k.file.link, k.epnum])
		)
}

Neat question!
Question: Is playablecharacters always a list or is it sometimes just a string?

Anyway, I think you can do the filtering you want just inside your for loop at the bottom:
if (group.key === dv.current().file.name) continue;
right before making a header out of group.key
continue basically skips the rest of the the for loop for the current value of group and goes on to the next one.

Bam, beautiful.

The code now reads as

dv.header(2, "Also Has Games With:")
// get all published podcast episodes

let pages = dv.pages('"00 Podcast Episodes"').where(p => p.stage == "Published")
//let characters = "PlayableCharacters".where contains(PlayableCharacters, this.current().PlayableCharacters) commented out on purpose
// create group object  

let groups = dv.pages(p.consoles).where(p => p.stage == "Published" && p.Type == "Regular Episode" && p.ComicPublisher != "NA").flatMap(page => dv.array(page.PlayableCharacters).map(t => Object.assign({}, page, {Guests: t })))

.where (p => p.stage == "Published" && p.PlayableCharacters)
.where (p => p.PlayableCharacters.includes(this.current().file.name))
.where (p => p.playablecharacters != this.current().file.name)

    .groupBy(page => page.Guests); 

for (let group of groups){
if (group.key === dv.current().file.name) continue;
	dv.header(4, group.key);
	dv.table(["Game", "EP Num"],
		group.rows
			.map(k => [k.file.link, k.epnum])
		)
}

I added a character to the list called Acid because it seemed like a DC character name and comes alphabetically before Batman. Gives me this without that new line of code.

Add that new line of code in and we have this.

I wanted to make sure that Batman wasn’t removed just by being the first on the list. He’s not, I love it.

1 Like

This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.