Tengo una variedad de diferentes estados de progreso y el estado actual. Quiero poder mostrar el porcentaje completado. Hasta ahora tengo esto:
getCompletedPercentage(): Status | undefined | number { const index = this.statuses.findIndex(status => status.id === this.currentStatus?.id) const percentage = 100 * (index / this.statuses.length) return percentage }, this.statuses es una matriz de los diferentes estados posibles (todos ellos también tienen id's a partir de 1). this.currentStatus es el estado actual, por supuesto :)
Entonces, digamos que la matriz de estados tiene 6 estados diferentes y el estado actual es 3, quiero poder mostrar el 50% completado. Con el cálculo anterior, no obtengo el 100% cuando el estado actual es el último estado. Comienza en 0 en el primero y luego aumenta, pero todavía es solo 85 cuando estoy en el último. Probablemente sea algo fácil que me estoy perdiendo, pero no puedo resolverlo :)
Los índices de matriz están basados en cero. Entonces, el valor más alto para el index es 5 (para una matriz de 6 elementos). Modifica tu código así:
getCompletedPercentage(): Status | undefined | number { const index = this.statuses.findIndex(status => status.id === this.currentStatus?.id) const percentage = 100 * index / (this.statuses.length - 1) return percentage } Una advertencia que debe tener en cuenta es que esto genera problemas si la longitud de la matriz es uno o menos, obtendrá resultados inconsistentes. Entonces podría intentar: const percentage = 100 * index / Math.max(this.statuses.length - 1, 1)
Puede lograr el requisito con esta lógica simple. En lugar de index , puede usar el status ID ya que comienza desde 1 .
// Input statuses array let statuses = [{id: 1}, {id: 2}, {id: 3}, {id: 4}, {id: 5}, {id: 6}]; // current status obect const currentStatus = {id: 3}; // filtered object by using array.find() method to get the current status id. const filteredObjId = statuses.find(status => status.id === currentStatus.id).id; // Calculating the percentage const percentage = 100 * (filteredObjId / statuses.length) // Result console.log(percentage);Acabo de agregar el fragmento de código JavaScript solo para mostrar la demostración. Puede usar la misma lógica en su código mecanografiado.