将 React 状态更新为二维数组?

Updating React state as a 2d array?

给定这个二维数组 React 状态,

this.state =
  board: [
    [null, null, null, null],
    [null, {id: 21, canSelect: false}, null, null],
    [null, {id: 42, canSelect: false}, null, null],
    [null, null, null, null]
  ]
}

关于使用 setState 更新此状态,我有 3 个主要问题:

1) 我如何在 React 中定位此二维数组状态中的特定索引?类似于 board[1][1]: {newObject}?

2) 我如何只更新每个值的 "canSelect" 值?

3) 如果我需要更新未知数量的数组索引(比如 2 到 8 个之间),我将如何只更新这些索引?

非常感谢任何帮助:)

1) 我如何在 React 中的这个二维数组状态中定位特定索引?

比方说,要访问带有 id = 21 的对象,请执行以下操作:

console.log(this.state.board[1][1].id)

2) 我如何只更新每个值的 "canSelect" 值?

要更改特定的 canSelect 属性 以不可变的方式进行:

onChange = e => this.setState(state =>({
    ...state,
    board : state.board.map((arr, i) => arr.map((item,j) =>{
        if(!item.hasOwnProperty('canSelect') return item
        return {...item, canSelect: !state.board[i][j]}
    }))
}))

如果我需要更新未知数量的数组索引(比如 2 到 8 个之间),我将如何只更新这些索引?

如果你想要 non-consecutive 个数组(稀疏),只需创建一个对象然后映射它的键而不是索引:

const obj = {myKey : 'foo'}
console.log(obj.myKey) //foo

在这个 question 中查看更多关于 sparse arrays 的信息,但这里的要点是不要使用它,即使它们占用的 space 不超过 "normal" ] 数组,你真正想要的是一个将键名映射到值的哈希机制,好老JSON

更新

根据您的评论,我意识到我误解了第三个问题,但我不排除它,因为它可能很有用。

因此,假设您要更新列表中包含的每个 ID 的 canSelect 属性:

const idsToUpdate = [1,22]

但是您不知道给定的 id 是否存在于您当前的集合中,解决方案是遍历每个项目,检查它们是否不为空,然后检查 id 是否在 idsToUpdate 列表,然后才更新 canSelect 属性:

this.setState(state =>({
    ...state,
    board : state.board.map((arr,i) => arr.map((item, j) =>{
        if(!item) return item
        if(!idsToUpdate.includes(item.id)) return item
        return {...item, canSelect: true}
    }))
}))