I'm trying to run two functions, calculoDes()
and desempenhos()
, in Angle 5, but strange behavior occurs as a result.
The first function calculates in some phases, always generating an object Array for the next step. The steps are commented (why maybe the problem is how I do this function, although it works):
calculoDes(){
//cada item da consulta de ficha cria um array keyarray e usa dados para calcular o quociente
this.fichas.subscribe(res => {
res.forEach(item => {
this.keyArray.push(item.$key);
this.quocienteCidade = +(((item.cap_cilindrica/100)+(item.quant_marchas/2)+(item.largura/100)+(item.comprimento/1000)+(item.entre_eixos/1000)+(item.peso_seco/10))*-1).toFixed(5);
this.desCidade.push({quociente: this.quocienteCidade, id: item.$key});
});
//O objeto desCidade precisa ser ordenado pelo valor do quociente, usando a função sortOn()
this.sortOn(this.desCidade, "quociente");
//O range é calculado dividindo 100 pela quantidade total de registros
this.range = 100/this.desCidade.length;
/*O desempenho é calculado a partir de uma "equivalencia" entre cada posição no array
desCidade e a porcentagem que ele representa. O maior sempre será 100.
Armazena no objeto desCidade2*/
for (var i = 0; i < this.desCidade.length; i++) {
this.desempenhoCidade = +(100-((i+1)-1)*this.range).toFixed(1);
this.desCidade2.push({desempenhoCid: this.desempenhoCidade});
}
//Merge de dois Arrays: desCidade e desCidade2
this.desCidade3 = _.merge(this.desCidade, _.map(this.desCidade2, this.getDesempenho));
//Retorna a ordenação anterior, mas com o desempenho calculado
this.resultCidade = this.sortTwo(this.desCidade3, this.keyArray, 'id');
//recupera somente o desempenho
this.resultCidade = this.resultCidade.map(a => a.desempenhoCid);
});
}
//ordenar usando a propriedade $key
//sortOn é para NEGATIVOS, COMO CIDADE
sortOn (arr, prop) {
arr.sort ((a, b) => {
if (a[prop] > b[prop]){
return -1;
} else if (a[prop] < b[prop]){
return 1;
} else {
return 0;
}
}
);
}
//ordenar um array of objects segundo a ordem de um array
sortTwo (array, order, key) {
array.sort ((a, b) => {
var A = a[key], B = b[key];
if (order.indexOf(A) > order.indexOf(B)) {
return 1;
} else {
return -1;
}
});
return array;
};
//Lodash para merge entre dois Arrays, incluindo a propriedade abaixo
getDesempenho(el) {
return _.pick(el, 'desempenhoCid');
}
I call this function in ngOnInit()
and the results are as expected.
From the results of this function, I need to use both arrays ( keyArray
and resultCidade
) to update a data in Firebase (using AngularFire):
desempenhos(){
this.keyArray.forEach(keyItem => {
this.db.object('ficha/' + keyItem).update({
//o dado a ser atualizado
des_cidade: this.resultCidade[0]
});
//a cada key, utilizo a primeira posição do array e depois o excluo
this.resultCidade.shift();
})
}
The problem is that this function only executes correctly in the first few records, but then, strangely, returns the function calculoDes()
and becomes as a loop inside another (considering both functions!).
I have already searched, I have refacted, but I could not figure out where the error is between the functions.