I have got an observable with Notes
this.notes$ = this.NoteService.notes$
notes$ =
0: {id: 4, user_id: 1, body: null, reminder: null, created_at: '2022-08-22T17:44:37.000000Z', …}
1: {id: 3, user_id: 1, body: 'die neuere', reminder: null, created_at: '2022-05-22T10:04:26.000000Z', …}
2: {id: 2, user_id: 1, body: 'Klappt das mit den Notizen?\n\n\nAuch mit Absätzen?', reminder: '2022-05-22 00:00:00', created_at: '2022-05-15T19:34:36.000000Z', …}
3:
body: "Meine Lieblingsnotiz"
created_at: "2022-05-15T18:13:43.000000Z"
id: 1
reminder: null
tags: Array(2)
0: {id: 1, name: 'Arbeit', slug: 'arbeit', created_at: null, updated_at: null, …}
1: {id: 4, name: 'Backlog', slug: 'backlog', created_at: null, updated_at: null, …}
length: 2
[[Prototype]]: Array(0)
title: "Test Notiz"
updated_at: "2022-05-15T18:13:57.000000Z"
user_id: 1
Now, I have switches in the html page, where I like to activate a filter for the tags. I push the filter to an additional array,
['backlog', 'arbeit', 'email']
but I find no way to the filter the observable by the array filter. I was thinking about something like
this.notes$ = this.NoteService.notes$.pipe(
map(notes=> notes
//.filter(t=> (!t.tags || t.tags.some(ai => this.filterTag.includes(ai))))
//.filter(t=> t.tags?.length > 0 && t.tags?.includes(this.filterTag)
//.filter(t=> t.tags!=undefined && t.tags.includes(this.filterTag))
))
Maybe you have an idea for me? Thanks in advance
CodePudding user response:
Check if its an array, then perform the ususal logic, else just find that string inside the array using the includes
method of array. If no tags exist, then we return the original array itself!
this.notes$ = this.NoteService.notes$.pipe(
map(notes=> notes.filter(t=>
t.tags && t.tags.length ?
(
Array.isArray(this.filterTag) ?
t.tags.some(x => this.filterTag.includes(x)) :
t.tags.includes(this.filterTag)
): true
))
CodePudding user response:
I fixed it in a different way
this.notes$ = this.NoteService.notes$.pipe(
map((notes => notes
.filter(t=> this.filterTaginNote(t)
))))
;
filterTaginNote(note: Note){
if (this.filterTag.length == 0){return true}
if (note.tags){
for(var i = 0; i < note.tags?.length; i ){
if (this.filterTag.includes(note.tags[i].slug)){
return true;
}
}
}
return false;
}