The supply-bin demo used a variable as an object key and scanned key-value pairs for low counts. Apply both ideas to volunteer shifts in script.js.
For example, a locker room with const lockers = { north: 0, south: 4 } could read lockers["north"] as zero and use Object.entries(lockers) to find names below two. Use Object.hasOwn(slots, requested) to distinguish a missing key from a present key with a value of zero. Here, you are auditing people assigned to shifts, not lockers.
Here is the same lookup-and-scan pattern with supply bins rather than shifts:
const bins = { paper: 0, ink: 4 };
const requested = "paper";
const low = Object.entries(bins).filter(([, count]) => count < 2);
console.log(bins[requested], low.map(([name]) => name)); // 0 ["paper"]
readAvailability(slots, requested) using bracket lookup and Object.hasOwn() to return the requested count, or null when the key is missing.lowShiftNames(slots, minimum) using Object.entries() to return the names below the minimum in entry order.auditShifts(slots, requested, minimum) to return { available, needsHelp } using those helpers.auditShifts().2 | checkIn, cleanup from auditShifts(shiftSlots, "checkIn", 3) on its own Console line.Use slots[requested] to look up a key held in a variable.
Object.entries(slots) gives [name, count] pairs to filter and map.