Estoy tratando de instalar algo de lógica en una pieza de JS en la que estoy trabajando que simplemente agregará/eliminará indicadores según algunas condiciones.
Consta principalmente de dos pasos.
En el Step 1 , hay una propiedad de 'estado', que puede tener varios indicadores:
- INCOMPLETE = 1 - COMPLETE = 2 - CURRENT = 4 - NOT_APPLICABLE = 8Cuando se analiza la matriz de objetos, verifica cada elemento para ver qué indicadores de estado están configurados:
if CURRENT is set, give class 'item-current' to node if INCOMPLETE is set, give class 'item-incomplete' to node if COMPLETE is set, give class 'item-complete' to node if NOT_APPLICABLE is set, give class 'item-not-applicable' to node A medida que el usuario interactúa con la página, los indicadores cambiarán en la matriz de objetos; cuando un usuario 'completa' un segmento, el estado de esa propiedad de objeto eliminará el indicador INCOMPLETE y agregará el indicador COMPLETE .
Intenté hacer esto de esta manera:
let v = [ { name: "Item 1", status: COMPLETE }, { name: "Item 2", status: INCOMPLETE | CURRENT }, { name: "Item 3", status: INCOMPLETE } ]; // Moving on to step 3 v[1].status = v[1].status ^ INCOMPLETE ^ CURRENT | COMPLETE; // remove incomplete and current from Item 2, marking as COMPLETE v[2].status = v[2].status | CURRENT; // marks Item 3 as current step, but not yet complete En el escenario anterior, el Item 1 se completó y el usuario pasó al Item 2 , que aún está INCOMPLETO y el paso ACTUAL. Por alguna razón, cuando estoy evaluando las condiciones de las banderas, me da (lo que parece) un comportamiento inesperado.
He intentado eliminar el indicador haciendo lo siguiente: v[1].status ^= CURRENT v[1].status = v[1].status ^ CURRENT
Y comparando por:
if ((v[1].status & COMPLETE) === COMPLETE) { // is complete } else { // not complete }Pero, sin embargo, todavía parezco enfrentar banderas que parecen estar todavía configuradas, o que se configuran inesperadamente. ¿Hay una manera más fácil de hacer esto?
El resultado deseado sería un caso en el que puedo configurar la bandera, eliminar la bandera y verificar si la bandera está configurada, usando constantes que son máscaras de bits.
¿Por qué está INCOMPLETO | ACTUAL lo mismo que INCOMPLETO ^ ACTUAL?
Estoy luchando por quitar un poco de la máscara y devolver ese valor que parece.
No puede usar operaciones bit a bit como esta con valores que no son potencias de 2.
El valor 3 podría ser cualquiera de los siguientes valores:
CURRENTCOMPLETE | INCOMPLETECURRENT | COMPLETECURRENT | INCOMPLETECURRENT | COMPLETE | INCOMPLETENo hay manera de saber qué combinación es.
Cambia los valores a
y es muy fácil hacer operaciones bit a bit con potencias de 2.