Я пытаюсь запустить две функции, calculoDes()
и desempenhos()
, в Angular 5, но в результате возникает странное поведение.
Первая функция выполняет вычисления в некоторых фазах, всегда генерируяМассив объектов для следующего шага.Шаги прокомментированы (возможно, проблема в том, как я выполняю эту функцию, хотя она работает):
calculoDes(){
// each query item of 'ficha' creates a keyarray array and uses data to compute the quotient (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});
});
// The 'desCidade' object must be ordered by the quotient value, using the sortOn()
this.sortOn(this.desCidade, "quociente");
// The 'range' is calculated by dividing 100 by the total amount of items
this.range = 100/this.desCidade.length;
/ * Performance (desempenhoCidade) is calculated from an "equivalence" between each position in the array 'deCidade' and the percentage that it represents. The largest will always be 100. Stores on object '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 between two Arrays: 'desCidade' e 'desCidade2'
this.desCidade3 = _.merge(this.desCidade, _.map(this.desCidade2, this.getDesempenho));
// Returns the previous sort, but with the already calculated performance
this.resultCidade = this.sortTwo(this.desCidade3, this.keyArray, 'id');
// retrieve only performance (desempenhoCid)
this.resultCidade = this.resultCidade.map(a => a.desempenhoCid);
});
}
//sort using the $ key property, sortOn is for NEGATIVES, AS '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;
}
}
);
}
// order an array of objects in the order of an 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 to merge between two Arrays, including the property below
getDesempenho(el) {
return _.pick(el, 'desempenhoCid');
}
Я вызываю эту функцию в ngOnInit()
, и результаты ожидаются.
Из результатов этой функции мне нужно использовать оба массива (keyArray
и resultCidade
) для обновления данных в Firebase
(используя AngularFire
):
desempenhos(){
this.keyArray.forEach(keyItem => {
this.db.object('ficha/' + keyItem).update({
// the item to be updated
des_cidade: this.resultCidade[0]
});
// to each $key, I use the first position of the array and then I exclude it
this.resultCidade.shift();
})
}
Проблема в том, чтоэта функция корректно работает только с первыми элементами, но затем странным образом возвращается к функции calculoDes()
и становится похожей на петлю за циклом (учитывая обе функции!).
Я уже искал ее, я переделал ее, но я не смог выяснить, где ошибка между функциями.