I have a set of booleans.
const [locks, setLock] = useState([false, false, false, false]);
Goal: I am trying to change a value based on the index by slicing the old lock array.
Issue: If the value is 1, the last part of the array (locks.slice(value + 1)) is returning as empty.
Shouldn’t slice returns the selected elements in an array, as a new array object, so it’s not like the locks array is getting changed?
function handleLock(event) {
const {value} = event.currentTarget;
const oldLock = locks[value]
console.log(oldLock)
const newLocks = locks.slice(0, value).concat([!oldLock]).concat(locks.slice(value + 1));
setLock(newLocks)
}
Broken Down
function handleLock(event) {
const {value} = event.currentTarget;
const oldLock = locks[value]
console.log(oldLock)
const locks1 = locks.slice(0, value)
const locks2 = locks.slice(value+1)
console.log(locks2)
const newLocks = locks1.concat([!oldLock]).concat(locks2);
setLock(newLocks)
}
Question: What is causing this issue and how do I solve it?
Advertisement
Answer
My guess would be, event.target.value might be returning a string instead of a number. This would cause the sliced value to be an empty array because adding a string to number results in concatenation, not addition.
Try using const value = parseInt(event.target.value, 10);
A suggestion would be to use spread syntax to duplicate the array then assign the value. This should make the code more readable and simpler
const newLocks = [...oldLocks]; newLocks[value] = !newLocks[value]; setLock(newLocks);