7
respostas

Filtro de propriedades vaza as informações

Olá pessoal. Estou com um problemaço. Ao tentar recuperar um objeto e distribuir em suas respectivas variáveis, esta ocorrendo que o código distribui o objeto apenas para duas propriedades e que não tem a ver com essa mesma propriedade. Segue:

for(i = 0; i < data.length; i++){
                                //console.log(data[i].tipoDespesas[0].nomeTipoDespesas);
                                var getValueObj = [];
                                $.each(JSON.parse(JSON.stringify(data)), function(i, obj) {

                                    if(obj.nomeCategoria in obj){
                                        console.info("=================== " + obj.catDespesaId);
                                    }
                                    if ( obj.catDespesaId === data[i].tipoDespesas[0].id ){

                                        getValueObj.push(obj); 
                                        console.log(getValueObj);
                                        objetoData = [data[i].descricaoDespesa, data[i].valorDespesa];
                                        drilldown_user.push(objetoData);

                                        var objDrill = {
                                            id   : data[i].tipoDespesas[0].nomeTipoDespesas,
                                            data : drilldown_user
                                        };
                                        user.push(objDrill);
                                    }
                                      return obj; 
                                });
                            };
7 respostas

Oi Clerman, tudo bem? Eu não entendi bem o que você quis dizer e nem o código deixou muito claro a ideia. Você quer tentar me explicar novamente?

Olá Wanderson! Veja o código completo. Estou gerando um gráfico HighChart pie Drildown que tem dois níveis, a categoria e as despesas que é montada com o JSON que recebo via ajax. No primeiro nível faz o filtro das categorias tranquilamente mas no segundo as despesas são distribuídas para apenas duas categorias, deixando o gráfico errado

$.getJSON('/financeiro/despesasPieCharts', function(){
                        }).done(function(data){

                            var user_data = []; //
                            var drill_down_data = [];//
                            var user = [];//
                            var drill = {};//
                            var objetoData = [];//
                            var drilldown_user = [];
                            var variaveis = [];//
                            var result = new Array;

                            for(i = 0; i < data.length; i++){
                                result = data[i].nomeCategoria;
                                variaveis.push(result);
                            }
                            function getWordCnt(){
                                var obj = {};

                                for(var i= 0, l = variaveis.length; i< l; i++){
                                    var item = variaveis[i];
                                    obj[item] = (obj[item] +1 ) || 1;
                                }

                                return obj;
                            }

                            var objetoVar = getWordCnt();
                            for (var [key, value] of Object.entries(objetoVar)) {
                                var obj = {name: key, y: value, drilldown: key,}; // Monta o objeto para o gráfico com as categorias
                                user_data.push(obj);
                            }
                            for(i = 0; i < data.length; i++){
                                var getValueObj = [];
                                $.each(JSON.parse(JSON.stringify(data)), function(i, obj) {

                                    if(obj.nomeCategoria in obj){
                                    }
                                    if ( obj.catDespesaId === data[i].tipoDespesas[0].id ){

                                        // Monta o objeto com as despesas - aqui acontece o erro.
                                        getValueObj.push(obj); 
                                        objetoData = [data[i].descricaoDespesa, data[i].valorDespesa];
                                        drilldown_user.push(objetoData);

                                        var objDrill = {
                                            id   : data[i].tipoDespesas[0].nomeTipoDespesas,
                                            data : drilldown_user
                                        };
                                        user.push(objDrill);
                                    }
                                      return obj; 
                                });
                            };

                            $('#despesasPieChart').highcharts({
                                chart: {
                                    type: 'pie'
                                },
                                title: {
                                    text: ''
                                },
                                xAxis: {
                                    type: 'category'
                                },

                                legend: {
                                    enabled: false
                                },

                                plotOptions: {
                                    series: {
                                        borderWidth: 0,
                                        dataLabels: {
                                            enabled: true
                                        }
                                    }
                                },

                                series: [{
                                    name: 'Categoria de Despesas',
                                    colorByPoint: true,
                                    data: user_data
                                }],
                                drilldown: {
                                    series: user
                                }
                            });

                        }).fail(function(data){
                        });

Clerman, desculpa a demora, mas será que seu problema não é no if? obj.catDespesaId === data[i].tipoDespesas[0].id O tipo despesas[0] vai apontar sempre pra uma única categoria, não? Esse índice é pra ser fixo mesmo?

Outra coisa, eu não entendi por que você usa o obj e o data[i] se eles são as mesmas coisas. Não? Cada objeto acessado dentro do each vai retornar exatamente o que está dentro do data[i]. Você está praticamente comparando um objeto com ele mesmo ao meu ver.

Olá Wanderson, pode ser no if sim, mas como estou perdido em como fazer, não consigo achar o caminho correto. O índice não precisa ser fixo, mas como faço o loop nesse objeto que esta dentro de outro objeto para então fazer a comparação? Vou te passar o meu json e o tipo de gráfico para ter uma ideia e agradeço a força! http://jsfiddle.net/8bfzo8s3/9/

http://ec2-34-227-195-94.compute-1.amazonaws.com:8080/financeiro/despesasPieCharts?_=1519668797641

Para cada tipoDespesas que é uma categoria que vem na primeira parte do gráfico vem a despesa que esta relacionado a ele... Será que pode ajudar?

Clerman, não posso acessar seu sistema na Amazon, não tenho credenciais pra isso, acredito que nem deva postar isso por aqui. Se puder, exporta um JSON curto, não precisa ser completão, assim a gente testa um pouco.

Olá Wanderson. Ok! Segue o Json!

https://gist.githubusercontent.com/anonymous/84f80fa354a83671c1a78df4d93aecaf/raw/9fa90948c0a242903a4194e6572870e28fc7c20e/gistfile1.txt

Clerman, desculpa a demora, estava procurando um tempo para analisar seu problema de perto. Pelo JSON que você me passou eu fiz uma pequena simulação de como suas variáveis chegariam até o final.

O resultado foi:

var objeto_var = { null: 4 };

var user_data = [ 
    { name: null, y: null, drilldown: null }, 
    { name: null, y: null, drilldown: null }, 
    { name: null, y: null, drilldown: null }, 
    { name: null, y: null, drilldown: null }, 
];

var drilldown_user = [
    ['Despesa 2', 50.00],
    ['Despesa 11', 550.00],
    ['Despesa 2', 50.00],
    ['788678678', 64.56],
]

var user = [
    { id: 5, data: [ ['Despesa 2', 50.00], ['Despesa 11', 550.00], ['Despesa 2', 50.00], ['788678678', 64.56] ] },
    { id: 3, data: [ ['Despesa 2', 50.00], ['Despesa 11', 550.00], ['Despesa 2', 50.00], ['788678678', 64.56] ] },
    { id: 4, data: [ ['Despesa 2', 50.00], ['Despesa 11', 550.00], ['Despesa 2', 50.00], ['788678678', 64.56] ] },
    { id: 4, data: [ ['Despesa 2', 50.00], ['Despesa 11', 550.00], ['Despesa 2', 50.00], ['788678678', 64.56] ] },
]

O problema começa quando você pega o nome da categoria. A categoria no JSON que você me passou vem sempre nula. Então o normal seria que ao gerar o gráfico no final, todos os dados sejam passados para a uma única categoria.

O outro problema está na associação do drilldown_user com o user quando você cria o objDrill, você sempre referencia o drilldown_user que faz com que todos os valores do drilldown sejam sempre repassados.

Então será que o problema não é outro? O filtro das categorias realmente está funcionando corretamente? Você tentou dar uns console.log no meio do caminho pra tentar detectar exatamente onde está o problema?

Uma dica que eu posso tentar dar é, tenta separar esse bloco enorme em funções menores que recebem exatamente o parâmetro que precisam. Ao fazer isso você vai poder até encontrar outros problemas que eu não encontrei.