Angular 5 update with forEach correct only in the first items

0

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.

    
asked by anonymous 09.12.2018 / 01:28

0 answers