PHP, Array Multidimensionale e Grafici

max1974

Utente Attivo
7 Mar 2013
54
0
6
Salve ragazzi il risultato di una query mi da questo
var results = [
{"Anno":"2019","Mese":"Ottobre","Difetto":"Crepati","Qta":"3"},
{"Anno":"2019","Mese":"Ottobre","Difetto":"Deformato","Qta":"2"},
{"Anno":"2019","Mese":"Ottobre","Difetto":"Rotto","Qta":"4"},
{"Anno":"2019","Mese":"November","Difetto":"Crepati","Qta":"4"},
{"Anno":"2019","Mese":"November","Difetto":"Deformato","Qta":"5"},
{"Anno":"2019","Mese":"November","Difetto":"Rotto","Qta":"6"},
{"Anno":"2019","Mese":"December","Difetto":"Crepati","Qta":"8"},
{"Anno":"2019","Mese":"December","Difetto":"Deformato","Qta":"1"},
{"Anno":"2019","Mese":"December","Difetto":"Rotto","Qta":"2"}
];
come faccio ad utilizzarlo in un grafico come questo QUI

1° Domanda. conviene farlo lato server o lato client ???
2° Domanda. Sarebbe meglio convertirlo in un array multidimensionale tipo ???
Ottobre>>
Crepati=3
Deformato=2
Rotto=4
Novembre>>
Crepati=4
Deformato=5
Rotto=6
Dicembre>>
Crepati=8
Deformato=1
Rotto=2

Grazie per qualsiasi consiglio.
 

max1974

Utente Attivo
7 Mar 2013
54
0
6
Cosa sbaglio ???
let Meses = Object.keys(results).reduce(
(acc, k) => (acc[results[k]] = [...(acc[results[k]] || []), k], acc) , {});
const listMese = [...new Set(results.map(it => it.Mese [it => it.Nome]))];
console.log(Meses);
console.log(listMese);
 

marino51

Utente Attivo
28 Feb 2013
2.655
134
63
Lombardia
da una decina d'anni utilizzo Highcharts per vedere in grafico i valori della produzione dei miei pannelli solari,
considera che ho realizzato più di 25 grafici, ciascuno di essi utilizza lo stesso template js a cui passo i dati con php

il mio approccio alle tue domande cerca di darti una visione d'insieme più che una specifica soluzione

la risposta alla prima domanda,
i dati sono generati sul server in un formato "standard" (vedi foto allegata come esempio)
il client genera il grafico

risposta alla seconda domanda,
dipende da come utilizzi i dati all'interno del js,
sta a te decidere in funzione della risorsa (codice js) che hai sviluppato

nel mio esempio (foto allegata) vedi,
variabili singole, per settaggi specifici
array monodimensionali (altrimenti detti vettori), per esempio per l'ascissa
array multidimensionali per l'ordinata

1575726184418.png


l'ordinata é gestita con un array multidimensionale perché ciascun grafico può avere più elementi gestiti,
quindi una dimensione specifica il numero di elementi, esempio energia generata, energia media, efficienza,
la seconda dimensione i valori specifici
un altro grafico può avere una sola curva … e via così

poi si può fare in molti altri modi
 
Ultima modifica:

macus_adi

Utente Attivo
5 Dic 2017
1.081
61
48
IT/SW
Con 2 funzioni generiche risolvi tutti i problemi lato client, senza ricorrere a loop inutili per la generazione dei dati lato server...

Nello specifico ...
  1. Da sistemista direi sia meglio operare i dati lato client (salvaguardando il server) utilizzandolo solo per estrazioni successive.
  2. Da developer anche se più semplice lavorare su php, risulterebbe inadeguato al calcolo continuo di tutti i dati in caso di visualizzazione live, quindi opterei sempre e comunque lato client.
  3. Per studio, forzerei tutti gli approcci possibili (non ne sono 2, bensì 4).
Lato server utilizzerei un protocollo diverso dal classico http per il recupero delle risorse, in modo tale da creare un push event solo su ciò che serve e non su tutti i dati...

Valuta l'utilizzo di ssr, o comunque sia una soluzione SPA utilizzando uno dei framework JS.

PS. jQuery non è un framework.


Codice:
//Il tuo risultato da query
let my='[{"Anno":"2019","Mese":"Ottobre","Difetto":"Crepati","Qta":"3"},{"Anno":"2019","Mese":"Ottobre","Difetto":"Deformato","Qta":"2"},{"Anno":"2019","Mese":"Ottobre","Difetto":"Rotto","Qta":"4"},{"Anno":"2019","Mese":"November","Difetto":"Crepati","Qta":"4"},{"Anno":"2019","Mese":"November","Difetto":"Deformato","Qta":"5"},{"Anno":"2019","Mese":"November","Difetto":"Rotto","Qta":"6"},{"Anno":"2019","Mese":"December","Difetto":"Crepati","Qta":"8"},{"Anno":"2019","Mese":"December","Difetto":"Deformato","Qta":"1"},{"Anno":"2019","Mese":"December","Difetto":"Rotto","Qta":"2"}]';
//Converto in Object
let object=JSON.parse(my);
console.log(object);
let data={
    x:[...new Set(createData(object,'Mese'))],
    x1:[...new Set(createData(object,'Difetto'))],
    y:[],
    series:createSeries([...new Set(createData(object,'Difetto'))],object),
};
console.log(data);

//Crea le serie in base all'array passato pulendo eventuali valori null o undefined
function createSeries(data,object){
    let ret=[];
    data.forEach(function(element){
        ret.push({data:[...new Set(createData(object,{f1:element,f2:'Difetto',return:'Qta'}))].filter(Number)});
    })
    return ret;
}
//Funzione generica per l'estrazione dei dati da un qualsiasi object!
//Potresti mettere una risorsa in ascolto e/o utilizzare objeserveObject!
function createData(data,type){
    if(typeof type=== 'object'){
        return data.map(function(v,k){
            if(type.f1===v[type.f2])return v[type.return];
        },type);
    }else{
        return data.map(function(v,k){
            return v[type];
        },type);
    }
}
 
Ultima modifica:
  • Like
Reactions: max1974

max1974

Utente Attivo
7 Mar 2013
54
0
6
da una decina d'anni utilizzo Highcharts per vedere in grafico i valori della produzione dei miei pannelli solari,
considera che ho realizzato più di 25 grafici, ciascuno di essi utilizza lo stesso template js a cui passo i dati con php

il mio approccio alle tue domande cerca di darti una visione d'insieme più che una specifica soluzione

la risposta alla prima domanda,
i dati sono generati sul server in un formato "standard" (vedi foto allegata come esempio)
il client genera il grafico

risposta alla seconda domanda,
dipende da come utilizzi i dati all'interno del js,
sta a te decidere in funzione della risorsa (codice js) che hai sviluppato

nel mio esempio (foto allegata) vedi,
variabili singole, per settaggi specifici
array monodimensionali (altrimenti detti vettori), per esempio per l'ascissa
array multidimensionali per l'ordinata

Vedi l'allegato 6788

l'ordinata é gestita con un array multidimensionale perché ciascun grafico può avere più elementi gestiti,
quindi una dimensione specifica il numero di elementi, esempio energia generata, energia media, efficienza,
la seconda dimensione i valori specifici
un altro grafico può avere una sola curva … e via così

poi si può fare in molti altri modi
OK sono riuscito ad ottenere i dati lato server in maniera più pulita.....
result=
{"sEcho":1,
"iTotalRecords":12,
"iTotalDisplayRecords":12,
"iLabelsRecord":2,
"Labels":["November","December"],
"iX_AsseRecord":6,
"X_Asse":["Crepati","Deformato","Impasto Sporco","Macchie Ferro","Mal Smaltati","Nessun Difetto"],
"iY_AsseRecord":12,
"Y_Asse":["0","0","0","1","0","2","1","2","0","0","1","0"]}
;
Vedi QUI dove sono arrivato
Ora la mia domanda è devo creare dei cicli dentro le Series
per poter leggere ( result.X_Asse[0],)
e per poter mettere su data (Y_Asse)
Con 2 funzioni generiche risolvi tutti i problemi lato client, senza ricorrere a loop inutili per la generazione dei dati lato server...

Nello specifico ...
  1. Da sistemista direi sia meglio operare i dati lato client (salvaguardando il server) utilizzandolo solo per estrazioni successive.
  2. Da developer anche se più semplice lavorare su php, risulterebbe inadeguato al calcolo continuo di tutti i dati in caso di visualizzazione live, quindi opterei sempre e comunque lato client.
  3. Per studio, forzerei tutti gli approcci possibili (non ne sono 2, bensì 4).
Lato server utilizzerei un protocollo diverso dal classico http per il recupero delle risorse, in modo tale da creare un push event solo su ciò che serve e non su tutti i dati...

Valuta l'utilizzo di ssr, o comunque sia una soluzione SPA utilizzando uno dei framework JS.

PS. jQuery non è un framework.


Codice:
//Il tuo risultato da query
let my='[{"Anno":"2019","Mese":"Ottobre","Difetto":"Crepati","Qta":"3"},{"Anno":"2019","Mese":"Ottobre","Difetto":"Deformato","Qta":"2"},{"Anno":"2019","Mese":"Ottobre","Difetto":"Rotto","Qta":"4"},{"Anno":"2019","Mese":"November","Difetto":"Crepati","Qta":"4"},{"Anno":"2019","Mese":"November","Difetto":"Deformato","Qta":"5"},{"Anno":"2019","Mese":"November","Difetto":"Rotto","Qta":"6"},{"Anno":"2019","Mese":"December","Difetto":"Crepati","Qta":"8"},{"Anno":"2019","Mese":"December","Difetto":"Deformato","Qta":"1"},{"Anno":"2019","Mese":"December","Difetto":"Rotto","Qta":"2"}]';
//Converto in Object
let object=JSON.parse(my);
console.log(object);
let data={
    x:[...new Set(createData(object,'Mese'))],
    x1:[...new Set(createData(object,'Difetto'))],
    y:[],
    series:createSeries([...new Set(createData(object,'Difetto'))],object),
};
console.log(data);

//Crea le serie in base all'array passato pulendo eventuali valori null o undefined
function createSeries(data,object){
    let ret=[];
    data.forEach(function(element){
        ret.push({data:[...new Set(createData(object,{f1:element,f2:'Difetto',return:'Qta'}))].filter(Number)});
    })
    return ret;
}
//Funzione generica per l'estrazione dei dati da un qualsiasi object!
//Potresti mettere una risorsa in ascolto e/o utilizzare objeserveObject!
function createData(data,type){
    if(typeof type=== 'object'){
        return data.map(function(v,k){
            if(type.f1===v[type.f2])return v[type.return];
        },type);
    }else{
        return data.map(function(v,k){
            return v[type];
        },type);
    }
}
GRAZIE MILLE !!!!
Ho provato a mettere insieme il tuo sistema che mi piace molto,
sembra funzionare quasi tutto !!!!!
nella console vedo la series definita in modo corretto (a me sembra), ma dove sbaglio che non vedo i dati ???

Vedi QUI quello che ho realizzato.
Tieni in considerazione che il grafico accetta la series in questo modo

series: [{
name: ['Crepato'],
data: [502, 635, 809, 947, 402, 3634, 268]
}, {
name: ['Deformato'],
data: [106, 107, 111, 133, 221, 767, 766]
}, {
name: ['Rotto'],
data: [163, 203, 276, 408, 547, 729, 628]
}]

Percui credo che il problema sia li da qualche parte.....
 
Ultima modifica:

macus_adi

Utente Attivo
5 Dic 2017
1.081
61
48
IT/SW
Percui credo che il problema sia li da qualche parte.....
Semplicemente i dati all'interno dell'0bject non hanno il cast ad Integer....
Prova con questa piccola modifica alla funzione createData parsando il dato come Intero, in quanto in origine non avendo il tipo è di default string!!!
la modifica interessa il return dentro a data.map
"return parseInt(v[type.return])"

Codice:
function createData(data,type){
            if(typeof type=== 'object'){
                return data.map(function(v,k){
                    if(type.f1===v[type.f2])return parseInt(v[type.return]);
                },type);
            }else{
                return data.map(function(v,k){
                    return v[type];
                },type);
            }
        }
 

marino51

Utente Attivo
28 Feb 2013
2.655
134
63
Lombardia
Ora la mia domanda è devo creare dei cicli dentro le Series
per poter leggere ( result.X_Asse[0],)
e per poter mettere su data (Y_Asse)
ti posto parte del mio template, per darti l'idea di come ho lavorato, in particolare,
nessun ciclo per l'ascissa, un numero di cicli necessario a trattare tutte le grandezze da rappresentare in grafico

ho messo alcuni commenti per rendere più specifica la funzionalità
JavaScript:
// valori passati da php per l'ascissa

    var    SPW_xAxis    = <?php echo json_encode($SPW_xAxis);   ?>;

// definizione dell' asse x per highcharts usando i valori di SPW_xAxis

// valori passati da php per l'ordinata

    var    SPW_yAxis      = <?php echo json_encode($SPW_yAxis);   ?>;
    var    SPW_ySeries    = <?php echo json_encode($SPW_ySeries); ?>;

    var    Len_yAxis      = SPW_yAxis.length,
           Len_ySeries    = SPW_ySeries.length,
           i              = 0;

    var    Chart_yAxis    = [],
        Chart_ySeries    = [];

    for(i=0; i < Len_yAxis;   i++) { get_yAxes();  }
    for(i=0; i < Len_ySeries; i++) { get_ySerie(); }

// definizione dell' asse y per highcharts usando i valori di SPW_yAxis e SPW_ySeries

// preparazione di Chart_yAxis da SPW_yAxis

// preparazione di Chart_ySeries da SPW_ySeries

// calcolo della regressione dove necessaria integrando Chart_ySeries
 
Ultima modifica:

marino51

Utente Attivo
28 Feb 2013
2.655
134
63
Lombardia
giusto per un'idea (3 grandezze in ordinata con le 3 scale ed in rosso 2 "plot-lines")

uno script php assembla l'insieme scegliendo quale funzione eseguire per selezionare i dati da db,
il cuore ….
PHP:
    if ($report[$SPWchoice]["JS"] == 'H') {
        require_once $report[$SPWchoice]["R"].".html";
    }
    else {
        require_once "func_".$report[$SPWchoice]["R"].".php";

        call_user_func($report[$SPWchoice]["R"]);

        $js_script = $report[$SPWchoice]["JS"];

        if ($report[$SPWchoice]["JS"] == 'T')    require_once "../forms/table.php";
        else                    require_once "../forms/graph.php";
    }
 
Ultima modifica:
  • Like
Reactions: max1974

max1974

Utente Attivo
7 Mar 2013
54
0
6
Semplicemente i dati all'interno dell'0bject non hanno il cast ad Integer....
Prova con questa piccola modifica alla funzione createData parsando il dato come Intero, in quanto in origine non avendo il tipo è di default string!!!
la modifica interessa il return dentro a data.map
"return parseInt(v[type.return])"

Codice:
function createData(data,type){
            if(typeof type=== 'object'){
                return data.map(function(v,k){
                    if(type.f1===v[type.f2])return parseInt(v[type.return]);
                },type);
            }else{
                return data.map(function(v,k){
                    return v[type];
                },type);
            }
        }
Ho apportato un'ulteriore correzione altrimenti poi non funziona con i dati formato String in questo modo dovrebbe funzionare con entrambi i dati...
JavaScript:
        function createData(data,type){

            if(typeof type=== 'object'){

                return data.map(function(v,k){

                    if(type.f1===v[type.f2])

                      if (isNaN(v[type.return])){

                        return v[type.return];

                      }

                      else{

                        return parseInt(v[type.return]);

                      };

                  },type);

            }else{

                return data.map(function(v,k){

                    return v[type];

                },type);

            }

        }
 
Ultima modifica:

max1974

Utente Attivo
7 Mar 2013
54
0
6
giusto per un'idea (3 grandezze in ordinata con le 3 scale ed in rosso 2 "plot-lines")
Vedi l'allegato 6790


uno script php assembla l'insieme scegliendo quale funzione eseguire per selezionare i dati da db,
il cuore ….
PHP:
    if ($report[$SPWchoice]["JS"] == 'H') {
        require_once $report[$SPWchoice]["R"].".html";
    }
    else {
        require_once "func_".$report[$SPWchoice]["R"].".php";

        call_user_func($report[$SPWchoice]["R"]);

        $js_script = $report[$SPWchoice]["JS"];

        if ($report[$SPWchoice]["JS"] == 'T')    require_once "../forms/table.php";
        else                    require_once "../forms/graph.php";
    }
Bellissimo,
non so perche ma per quello che serve a me credo sia pure troppo,
non vedo male cio che ho appena realizzato QUI essendo IO alle prime armi.... :) :)
 

max1974

Utente Attivo
7 Mar 2013
54
0
6
Semplicemente i dati all'interno dell'0bject non hanno il cast ad Integer....
Prova con questa piccola modifica alla funzione createData parsando il dato come Intero, in quanto in origine non avendo il tipo è di default string!!!
la modifica interessa il return dentro a data.map
"return parseInt(v[type.return])"

Codice:
function createData(data,type){
            if(typeof type=== 'object'){
                return data.map(function(v,k){
                    if(type.f1===v[type.f2])return parseInt(v[type.return]);
                },type);
            }else{
                return data.map(function(v,k){
                    return v[type];
                },type);
            }
        }
Ho ancora un problema quando la QTA di una serie è pari a zero mi ritrovo che la serie non mi aggiunge il valore
ossia anziche trovarmi
series:
data [0,2,5]
mi ritrovo
series:
data [2,5]
e cosi mi sballa tutto il grafico.
 

Max 1

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
29 Feb 2012
3.985
295
83
@max1974
Quando posti del codice devi usare gli appositi tag!
Te lo avevo già chiesto ancora
Leggi anche attentamente il regolamento del forum
Ultimo avvertimento
 
  • Like
Reactions: max1974

max1974

Utente Attivo
7 Mar 2013
54
0
6
un'attenzione aggiuntiva che nasce dalla domanda, ma capiterà mai di gestire percentuali ?
mi sembra che lo script sia focalizzato su valori interi, ma forse sbaglio
Percentuali si potranno anche capitare come potranno capitare numeri decimali
 

macus_adi

Utente Attivo
5 Dic 2017
1.081
61
48
IT/SW
mi sembra che lo script sia focalizzato su valori interi, ma forse sbaglio
Tendenzialmente si utilizzano i dati con cast corretto e non a stringa...
L'intervento merita attenzione, ma non sulla parte dello script ma sulla parte del json, cosa che, non sarebbe sfuggita prestando più attenzione...

PS: Lo script è stato scritto in modo da lavorare sui dati originali...


Attenzione una percentuale è un float e/o integer, con postfix una stringa, quindi il nesso tra dati e post fisso non lo trovo!!!!
 

max1974

Utente Attivo
7 Mar 2013
54
0
6
Tendenzialmente si utilizzano i dati con cast corretto e non a stringa...
L'intervento merita attenzione, ma non sulla parte dello script ma sulla parte del json, cosa che, non sarebbe sfuggita prestando più attenzione...

PS: Lo script è stato scritto in modo da lavorare sui dati originali...


Attenzione una percentuale è un float e/o integer, con postfix una stringa, quindi il nesso tra dati e post fisso non lo trovo!!!!
scusa cosa significa : "Tendenzialmente si utilizzano i dati con cast corretto e non a stringa..."
io inizialmente converto cio che mi ritorna da una interrogazione $.Ajax
Codice:
echo json_encode($result);
Utilizzando
Codice:
success: function(response){
let object=JSON.parse(JSON.stringify(response.aoData));
e secondo te come dovrei risolvere ???
 

macus_adi

Utente Attivo
5 Dic 2017
1.081
61
48
IT/SW
Prima di fare il json_encode dei dati, devono avere il cast ossia, immagina un'estrazione da DB di questo genere:
id,nome,cognome,eta
Il risultato è del tipo:
PHP:
//i dati non hanno il tipo....
$data=[['id'=>"1",'nome'=>'pippo','cognome'=>'caio','eta'=>"22"]];
Quindi nel modello dati si utilizza il cast fields per estrarre i dati in modo corretto, quindi:
PHP:
$data=[['id'=>(integer)"1",'nome'=>'pippo','cognome'=>'caio','eta'=>(integer)"22"]];
Nell conversione in JSON si traduce in:
Codice:
let obj=[
{
id:1,
nome:"pippo",
cognome:"caio",
eta:22
}
]
Dove differisce dalla tua estrazione dove sono tutte stringhe, lo noti da Qta (intero) parsato a Stringa!
{"Anno":"2019","Mese":"Ottobre","Difetto":"Crepati","Qta":"3"},
Con php è implicita la conversione di tipo, in js no...

Il problema è che anche un numero 3.212 su php se non formattato correttamente, con la funzione json_encode diventerà del tipo "3.212" quindi una stringa...

Questo accade per la debole tipizzazione del linguaggio... Questa però è tutt'altra storia!
 

max1974

Utente Attivo
7 Mar 2013
54
0
6
Prima di fare il json_encode dei dati, devono avere il cast ossia, immagina un'estrazione da DB di questo genere:
id,nome,cognome,eta
Il risultato è del tipo:
PHP:
//i dati non hanno il tipo....
$data=[['id'=>"1",'nome'=>'pippo','cognome'=>'caio','eta'=>"22"]];
Quindi nel modello dati si utilizza il cast fields per estrarre i dati in modo corretto, quindi:
PHP:
$data=[['id'=>(integer)"1",'nome'=>'pippo','cognome'=>'caio','eta'=>(integer)"22"]];
Nell conversione in JSON si traduce in:
Codice:
let obj=[
{
id:1,
nome:"pippo",
cognome:"caio",
eta:22
}
]
Dove differisce dalla tua estrazione dove sono tutte stringhe, lo noti da Qta (intero) parsato a Stringa!


Con php è implicita la conversione di tipo, in js no...

Il problema è che anche un numero 3.212 su php se non formattato correttamente, con la funzione json_encode diventerà del tipo "3.212" quindi una stringa...

Questo accade per la debole tipizzazione del linguaggio... Questa però è tutt'altra storia!
comincio dall'inizio:
lato php ho messo come mi hai detto:
PHP:
$data[]=['Anno'=>(integer)$row['Anno'],'Mese'=>(string)$row['Mese'],'Difetto'=>(string)$row['Difetto'],'Qta'=>(integer)$row['Qta']]; 

$result = ["sEcho" => 1,
             "iTotalRecords" => count($data),
             "iTotalDisplayRecords" => count($data),
             "aoData" => $data
           ];
echo json_encode($result);
e sempre lato PHP a video ho il seguente dataset:
PHP:
{"sEcho":1,"iTotalRecords":10,"iTotalDisplayRecords":10,"aoData":[{"Anno":2019,"Mese":"November","Difetto":"Deformato","Qta":0},
{"Anno":2019,"Mese":"November","Difetto":"Impasto Sporco","Qta":3},
{"Anno":2019,"Mese":"November","Difetto":"Macchie Ferro","Qta":0},
{"Anno":2019,"Mese":"November","Difetto":"Mal Smaltati","Qta":2},
{"Anno":2019,"Mese":"November","Difetto":"Nessun Difetto","Qta":0},{"Anno":2019,"Mese":"December","Difetto":"Deformato","Qta":1},
{"Anno":2019,"Mese":"December","Difetto":"Impasto Sporco","Qta":0},
{"Anno":2019,"Mese":"December","Difetto":"Macchie Ferro","Qta":2},
{"Anno":2019,"Mese":"December","Difetto":"Mal Smaltati","Qta":0},
{"Anno":2019,"Mese":"December","Difetto":"Nessun Difetto","Qta":0}]}
a questo punto arriva il dataset a js e dopo
JavaScript:
      success: function(response){
        //Converto in Object
        let object=JSON.parse(JSON.stringify(response.aoData));
        console.log(object);
e nella console trovo
Codice:
0: {Anno: 2019, Mese: "November", Difetto: "Deformato", Qta: 0}
1: {Anno: 2019, Mese: "November", Difetto: "Impasto Sporco", Qta: 3}
2: {Anno: 2019, Mese: "November", Difetto: "Macchie Ferro", Qta: 0}
3: {Anno: 2019, Mese: "November", Difetto: "Mal Smaltati", Qta: 2}
4: {Anno: 2019, Mese: "November", Difetto: "Nessun Difetto", Qta: 0}
5: {Anno: 2019, Mese: "December", Difetto: "Deformato", Qta: 1}
6: {Anno: 2019, Mese: "December", Difetto: "Impasto Sporco", Qta: 0}
7: {Anno: 2019, Mese: "December", Difetto: "Macchie Ferro", Qta: 2}
8: {Anno: 2019, Mese: "December", Difetto: "Mal Smaltati", Qta: 0}
9: {Anno: 2019, Mese: "December", Difetto: "Nessun Difetto", Qta: 0}
Ora entro nelle 2 funzioni :
Codice:
series:createSeries([...new Set(createData(object,'Difetto'))],object),
        function createData(data,type){
            if(typeof type=== 'object'){
                return data.map(function(v,k){
                    if(type.f1===v[type.f2])
                      if (isNaN(v[type.return])){
                        return v[type.return];
                      }
                      else{                       
                          return parseInt(v[type.return]);                       
                      };
                  },type);
            }else{
                return data.map(function(v,k){
                    return v[type];
                },type);
            }
        }
        function createSeries(data,object){
            let ret=[];
            data.forEach(function(element){
              ret.push({data:[...new Set(createData(object,{f1:element,f2:'Difetto',return:'Qta'}))].filter(Number),                       
                          name:[...new Set(createData(object,{f1:element,f2:'Difetto',return:'Difetto'}))].filter(function (item) {
                            if(typeof item ==='string'){return item;};
                          })
                      });
            })
            return ret;
        }
        console.log(data)
ed alla fine stampo nella console i dati elaborati mi ritrovo.
Codice:
series: Array(5)
0:
data: [1]
name: ["Deformato"]
__proto__: Object
1:
data: [3]
name: ["Impasto Sporco"]
__proto__: Object
2:
data: [2]
name: ["Macchie Ferro"]
__proto__: Object
3:
data: [2]
name: ["Mal Smaltati"]
__proto__: Object
4:
data: []
name: ["Nessun Difetto"]
__proto__: Object
e da come vedi i valori a ZERO non sono stati riportati nei SERIES.DATA e non riesco a capire il motivo.