开发者问题收集

为什么切片返回一个空数组?

2020-09-19
1503

我有一组布尔值。

const [locks, setLock] = useState([false, false, false, false]);

目标: 我试图通过对旧锁数组进行切片来更改基于索引的值。

问题: 如果值为 1,则数组的最后一部分 ( locks.slice(value + 1) ) 将返回为空。

切片不应该将数组中选定的元素作为新数组对象返回吗,这样就不会更改锁数组?

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)
  }

已分解

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)
  }

问题: 是什么导致了此问题?我该如何解决?

1个回答

我的猜测是, event.target.value 可能返回 string 而不是 number 。这将导致切片值为空数组,因为将字符串添加到数字会导致连接,而不是相加。

尝试使用 const value = parseInt(event.target.value, 10);

建议使用扩展语法复制数组,然后分配值。这应该使代码更易读且更简单

const newLocks = [...oldLocks];
newLocks[value] = !newLocks[value];
setLock(newLocks);
Hassan Naqvi
2020-09-19