Javascript 从具有接头的阵列中删除项目时遇到问题

Javascript 从具有接头的阵列中删除项目时遇到问题,javascript,reactjs,Javascript,Reactjs,我想做什么 我想创建一个切换函数,允许用户通过将复选框添加到数组(我的状态对象)或(如果它们已经在数组中)从数组中删除复选框来单击或关闭复选框 我预期会发生什么 使用以下代码,如果复选框不在所选数组中,则应添加它。如果已存在,请将其删除: if (this.state.selected.indexOf(rowNumber) == -1) { let tempState = this.state.selected tempState.push(rowNumber)

我想做什么

我想创建一个切换函数,允许用户通过将复选框添加到数组(我的状态对象)或(如果它们已经在数组中)从数组中删除复选框来单击或关闭复选框

我预期会发生什么

使用以下代码,如果复选框不在所选数组中,则应添加它。如果已存在,请将其删除:

   if (this.state.selected.indexOf(rowNumber) == -1) {

      let tempState = this.state.selected
      tempState.push(rowNumber)

      this.setState({
        selected: tempState
      })

    } else if (this.state.selected.indexOf(rowNumber) > -1 ){

      let tempIndex = this.state.selected.indexOf(rowNumber)
      let tempState = JSON.parse(JSON.stringify(this.state.selected))
      tempState = tempState.splice(tempIndex, 1)

      this.setState({
        selected: tempState
      })

    }
我的状态对象是一个简单数组

实际发生的情况

当splice激活时,它将删除以前单击的图元,而不是我当前单击的图元

我想知道为什么不只是选择/取消选择当前单击的复选框。谢谢

编辑:解决如下

下面是工作示例的链接:

Array.splice()
在适当的位置删除数组中的元素并返回删除的元素。由于指定了
tempState=tempState.splice(tempinex,1)
tempState
现在包含已删除的元素。您只需将该行重写为
tempState.splice(tempinex,1)
即可修复它(无需重新指定
tempState


另外,您可以使用
a=b.slice()

复制数组,而不是执行JSON解析/字符串化,我可以建议一种不同的方法吗?数组是JavaScript,可以处理设置非连续索引,因此可以从空数组开始,如下所示:

const state = [];
state[3] = true;
[undefined, undefined, undefined, true];
…然后像这样做:

const state = [];
state[3] = true;
[undefined, undefined, undefined, true];
…然后您将得到一个如下所示的数组:

const state = [];
state[3] = true;
[undefined, undefined, undefined, true];
然后还可以访问一个越界索引,它也被简单地视为未定义索引

if (state[5]) {
  console.log('You won\'t see this.');
}
else {
  console.log('You will see this.');
}
由于JavaScript数组的工作方式,您只需执行以下操作即可存储和切换按钮状态:

state[rowNumber] = !state[rowNumber];

请发布一个btw。
tempState.push(rowNumber)
不正常,您正在直接修改状态。是的,Giorgi,谢谢。在你发表评论之前我就注意到了。我现在还在做一个JSON.parse/stringify操作。啊,我不知道我怎么会错过这个!谢谢