Javascript - Logic Handling Data from Arrays

Asked

Viewed 141 times

0

I have a very complex logic problem. I have to compare 4 arrays and make them work together. I will explain it better

Example of how it can come:

var mesA = [ "fev", "mar", "jun" ]
var valorA = [ 50,   50,    50 ]

var mesB = [ "jan", "fev", "mar", "jul", "ago" ]
var valorB = [ 25,    25,   25,    25,    25 ]

var mesA_Final = []
var valorA_Final = []

var mesB_Final = []
var valorB_Final = []

How should the output of this:

var mesA_Final = [ "jan", "fev", "mar", "jun", "jul", "ago"  ]
var valorA_Final = [ 0,     50,    50,   50,     0,     0    ]

var mesB_Final = [ "jan", "fev", "mar", "jun", "jul", "ago"  ]
var valorB_Final = [ 25,   25,    25,     0      25    25    ]

I need to compare these 2 arrays, sort them by month name, and compare both arrays so that they draw their differences and enter value 0 in the month one has and the other has not, and vice versa.

Obs¹: these 4 arrays will always come with correct month and value, if for example come 3 months, will come 3 values.
Obs²: What will come in double arrays is dynamic, can come 1 month 1 value, as can come 2 months 2 values, 3 months 3 values (...)

The most I got was this: Jsfiddle

Does anyone have any idea?

  • 2

    You have values that are linked and different arrays, why not make an array of objects that have mes and valor? It would be much easier to sort. For example: mesA = [{mes: 'jan', valor: 50}, {mes: 'fev', valor: 50}, {mes: 'mar', valor: 50}];

  • 'Cause the way it is now, to order the way you want it to be too hard and hard to understand.

  • 1

    I think I made some progress with your code, check it out: https://jsfiddle.net/ukz5uves/1/

1 answer

1


This should do what you want (commented):

var mesA = [ "fev", "mar", "jun" ]
var valorA = [ 50,   50,    50 ]

var mesB = [ "jan", "fev", "mar", "jul", "ago" ]
var valorB = [ 25,    25,   25,    25,    25 ]

var mesA_Final = []
var valorA_Final = []

var mesB_Final = []
var valorB_Final = []

// criei uma array com a ordem dos meses. necessário para organizar as arrays mesA_Final e mesB_Final
var meses = ['jan','fev','mar', 'abr','mai','jun','jul','ago','set','out','nov','dez'];

function rodar(){
    // verificar se valores em mesB tem em mesA
    $.each(mesB,function(e,v){
        mesA_Final.push(v);
    });

    // inserir valores de mesA em mesA_final
    $.each(mesA,function(e,v){
        if(mesA_Final.indexOf(v) == -1){
            mesA_Final.push(v);
        }
    });

    // organizar valores na ordem do mês
    mesA_Final.sort(function(a,b){
        return meses.indexOf(a) > meses.indexOf(b);
    });

    // inserir valores em valorA_Final
    $.each(mesA_Final,function(e,v){
        if(mesA.indexOf(v) == -1){
            valorA_Final.push(0);
        }else{
            valorA_Final.push(valorA[mesA.indexOf(v)]);
        }
    });

    // B

    // verificar se valores em mesA tem em mesB
    $.each(mesA,function(e,v){
        mesB_Final.push(v);
    });

    // inserir valores de mesB em mesB_final
    $.each(mesB,function(e,v){
        if(mesB_Final.indexOf(v) == -1){
            mesB_Final.push(v);
        }
    });

    // organizar valores na ordem do mês
    mesB_Final.sort(function(a,b){
        return meses.indexOf(a) > meses.indexOf(b);
    });

    // inserir valores em valorB_Final
    $.each(mesB_Final,function(e,v){
        if(mesB.indexOf(v) == -1){
            valorB_Final.push(0);
        }else{
            valorB_Final.push(valorB[mesB.indexOf(v)]);
        }
    });
}

var mesA = [ "fev", "mar", "jun" ]
var valorA = [ 50,   50,    50 ]

var mesB = [ "jan", "fev", "mar", "jul", "ago" ]
var valorB = [ 25,    25,   25,    25,    25 ]

var mesA_Final = []
var valorA_Final = []

var mesB_Final = []
var valorB_Final = []

// criei uma array com a ordem dos meses. necessário para organizar as arrays mesA_Final e mesB_Final
var meses = ['jan','fev','mar', 'abr','mai','jun','jul','ago','set','out','nov','dez'];

function rodar(){
	// verificar se valores em mesB tem em mesA
	$.each(mesB,function(e,v){
		mesA_Final.push(v);
	});

	// inserir valores de mesA em mesA_final
	$.each(mesA,function(e,v){
		if(mesA_Final.indexOf(v) == -1){
			mesA_Final.push(v);
		}
	});
	
	// organizar valores na ordem do mês
	mesA_Final.sort(function(a,b){
		return meses.indexOf(a) > meses.indexOf(b);
	});

	// inserir valores em valorA_Final
	$.each(mesA_Final,function(e,v){
		if(mesA.indexOf(v) == -1){
			valorA_Final.push(0);
		}else{
			valorA_Final.push(valorA[mesA.indexOf(v)]);
		}
	});

	// B

	// verificar se valores em mesA tem em mesB
	$.each(mesA,function(e,v){
		mesB_Final.push(v);
	});

	// inserir valores de mesB em mesB_final
	$.each(mesB,function(e,v){
		if(mesB_Final.indexOf(v) == -1){
			mesB_Final.push(v);
		}
	});
	
	// organizar valores na ordem do mês
	mesB_Final.sort(function(a,b){
		return meses.indexOf(a) > meses.indexOf(b);
	});

	// inserir valores em valorB_Final
	$.each(mesB_Final,function(e,v){
		if(mesB.indexOf(v) == -1){
			valorB_Final.push(0);
		}else{
			valorB_Final.push(valorB[mesB.indexOf(v)]);
		}
	});
	
	// daqui pra baixo é apenas para apresentação, pode apagar essas linhas
	$.each(mesA_Final,function(e,v){
		$("#teste").append(v+", ");
	});
	
	$("#teste").append("<br>");

	$.each(valorA_Final,function(e,v){
		$("#teste").append(v+", ");
	});

	$("#teste").append("<br><br>");

	$.each(mesB_Final,function(e,v){
		$("#teste").append(v+", ");
	});
	
	$("#teste").append("<br>");

	$.each(valorB_Final,function(e,v){
		$("#teste").append(v+", ");
	});
	
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="button" value="Checar" onclick="rodar()" />
<br />
<br />
<div id="teste"></div>

  • Good logic! Thank you :)

Browser other questions tagged

You are not signed in. Login or sign up in order to post.