Sto sviluppando un grafico nodo / bordi utilizzando la libreria JavaScript d3 (la lingua non è così importante, questa è una domanda concettuale / di approccio). Il mio grafico ha la capacità di filtrare dinamicamente i nodi sulla base di vari criteri, incluso il tipo e gli attributi specifici. Ad esempio, supponiamo di avere i seguenti oggetti nel mio set di dati:
nodes = [
{"type": "fruit", "name": "banana", "length": 5},
{"type": "fruit", "name": "banana", "length": 6},
{"type": "fruit", "name": "banana", "length": 4},
{"type": "fruit", "name": "apple", "length": 3},
{"type": "fruit", "name": "apple", "length": 2},
{"type": "fruit", "name": "cherry", "length": 1},
{"type": "animal", "species": "monkey", "name": "kong", "eats": "banana"},
{"type": "animal", "species": "monkey", "name": "george", "eats": "banana"},
{"type": "animal", "species": "rabbit", "name": "harvey", "eats": "apple"},
{"type": "animal", "species": "bird", "name": "bluebird", "eats": "cherry"},
{"type": "location", "name": "zoo", "residents": ["monkey", "rabbit", "bird"]},
{"type": "location", "name": "tree", "residents": ["apple", "banana", "cherry"]}
]
I collegamenti (spigoli) vengono generati dinamicamente per gli elementi in base alle loro relazioni. Sono disponibili i seguenti filtri:
-
Tipo -
[fruit, animal, location]
-
Nome : filtri basati sul fatto che
name
stringa contenga testo specifico - Lunghezza - non tutti i tipi hanno questa proprietà, ma quelli che lo fanno possono essere filtrati per lunghezza
- Specie - non tutti i tipi hanno questa proprietà, ma quelli che lo fanno possono essere filtrati per specie
Si supponga anche che una proprietà sia stata aggiunta dinamicamente ad ogni nodo che indica se è attualmente filtrata o meno (cioè un valore booleano). Di default il valore è false
(tutti i nodi sono visibili).
Supponiamo che un utente applichi i seguenti filtri:
-
L'utente applica un filtro ai dati per mostrare solo i nodi in cui
type == "fruit"
(tutti i valori dei filtri di tutti i nodi sono ora impostati sutrue
eccetto quelli di tipo "frutto") -
L'utente applica quindi un filtro ai dati per mostrare solo i nodi in cui
name
non contiene il carattere'a'
(solo "cherry" non è attualmente filtrato, tutti gli altri nodi 'i valori dei filtri ora sono impostati sutrue
) -
L'utente rimuove il filtro applicato in # 1 (ora solo i nodi il cui valore
name
non contengono il carattere'a'
deve essere visualizzato)
Come faccio a gestire più filtri per assicurarmi che non "annullino" l'un l'altro, ma non abbiano problemi logici se vengono applicati (e non applicati) in ordini diversi?
Nella mia situazione attuale, il passaggio 3 comporterà la visualizzazione di tutti i nodi, ma non è corretto.
Esiste un modo logico per controllare prima di applicare i filtri (ad es. if (node.filtered) {// only apply new filters to unfiltered data}
, o il filtro da # 2 deve essere "riapplicato" al set di dati dopo aver rimosso il filtro da # 1 (sto pensando che quest'ultimo) Devo memorizzare tutti i filtri applicati in una lista ordinata (o altra struttura di dati) e quindi riapplicarli in ordine ogni volta che viene rimosso un filtro (non applicato)? O sono troppo complicato?