Utilizzando l'API di visualizzazione di Google, utilizzo google.visualization.data.group per creare tabelle secondarie in base ai miei dati non elaborati. I miei dati grezzi utilizzano il trucco di {v: "US", f: "Stati Uniti"} per visualizzare qualcosa di diverso dal valore, ma quando utilizzo la funzione di aggregazione, la formattazione viene eliminata lasciando solo la parte "Stati Uniti".Conserva la formattazione utilizzando il gruppo per aggregazione nell'API di visualizzazione di Google
C'è un modo per mantenere la formattazione originale o un modo semplice per aggiungerlo nuovamente ai DataTable creati utilizzando l'aggregazione di gruppo?
dati del campione:
[2010, {v:"MA", f:"Morocco"}, {v:"002", f:"Africa"}, {v:"002", f:"Northern Africa"}, 21.12724],
[2010, {v:"AW", f:"Aruba"}, {v:"019", f:"Americas "}, {v:"019", f:"Caribbean"}, 0.98],
[2010, {v:"AF", f:"Afghanistan"}, {v:"142", f:"Asia"}, {v:"142", f:"Southern Asia"}, 0.9861],
[2010, {v:"AO", f:"Angola"}, {v:"002", f:"Africa"}, {v:"002", f:"Middle Africa"}, 5.11774],
aggregazione Funzione:
var countryData = google.visualization.data.group(
rawData,
[0, 1],
[{'column': 4, 'aggregation': google.visualization.data.sum, 'type': 'number'}]
);
Edit:
Su ulteriore riflessione, è probabilmente impossibile gruppo con il formato poiché non v'è alcuna garanzia che il formato per ogni valore sarà coerente. Con questo in mente, probabilmente è meglio (o solo possibile) scrivere una funzione che aggiungerà i formati a ciascuna colonna dei miei dati. Quindi la domanda diventa: "Come diavolo faccio?"
Preferisco davvero non creare i miei dati non elaborati come valori non formattati da solo, e quindi tabelle aggiuntive per cercare i formati per ogni valore. Ciò richiederebbe due tabelle aggiuntive (una per le regioni che è di 28 righe, una per i paesi che supera le 240 righe) e quindi la creazione di due funzioni per esaminare ciascun valore nella tabella raggruppata (che avrà più di 30 anni di dati, significa migliaia di righe) aggiungendo i valori.
Sembra una soluzione davvero complessa.
C'è un modo per farlo con le funzioni di modifica? Posso scrivere una funzione per restituire ogni valore nella tabella come un oggetto formattato {v: "US", f: "Stati Uniti"}? O c'è un modo semplice per scrivere un formattatore di colonne che cercherà il valore appropriato nella mia tabella originale e adotterà quel formato? Quale causerebbe il minimo mal di testa sia per me (chi deve scriverlo), sia per gli utenti (che devono caricarlo)?
EDIT 2:
Sembra che dovrei essere in grado di creare un formattatore per la nuova tabella utilizzando qualcosa di simile:
function (dt, row) {
return {
v: (dt.getValue(row, 1)/1000000),
f: (dt.getValue(row, 1)/1000000) + 'M'
}
}
Ma il problema diventa quello dal momento che non sto trattando con il numero formati, dovrei creare una sorta di tabella di ricerca che prenderà il valore, cercarlo in una tabella di ricerca e quindi restituire il formato appropriato. Sembra anche che possa dover scorrere l'intera tabella, riga per riga, che è migliaia di righe.
Non riesco a immaginare che non ci sia un modo semplice per farlo senza un ciclo di forza bruta e l'assegnazione di valori.
EDIT 3:
Così ho provato qualcosa di complicato. Anziché impostare ogni riga come valore/formato, ho creato la parte valore/formato come una stringa, quindi, dopo il raggruppamento, ho utilizzato eval() per valutare gli oggetti. Questo ha funzionato alla grande.Ecco i dati:
[2010, "{v: 'MA', f: 'Morocco'}", 21.13],
[2010, "{v: 'AW', f: 'Aruba'}", 0.98],
[2010, "{v: 'AF', f: 'Afghanistan'}", 0.99],
[2010, "{v: 'AO', f: 'Angola'}", 5.12],
Ecco il nuovo codice:
var countryCount = countryData.getColumnRange(0).count;
for (var i = 0; i <= countryCount; i++) {
countryData.setValue(i, 1, eval('(' + countryData.getValue(i,1) + ')'));
};
Il problema è che quando l'uscita ad un Google DataTable, mostra {v: 'AE', f: ' Emirati Arabi Uniti} nonostante il fatto che il controllo del risultato con eval correttamente mi dà:
>>> eval('(' + countryData.getValue(i,1) + ')')
Object v="AE" f="United Arab Emirates"
Così che cosa sto facendo male qui?