Javascript React Immutability helper-更新数组中的许多类似对象

Javascript React Immutability helper-更新数组中的许多类似对象,javascript,arrays,reactjs,redux,store,Javascript,Arrays,Reactjs,Redux,Store,我在Redux商店中有状态,我想将所有isPlaying更改为false。我不知道怎样才能做得更好。以下是我到目前为止所做的 const INITIAL_STATE = { isPlaying: true, allLangs: [ { shortName: 'es', fullName: "spanish", order: 0, isPlaying: false }, {

我在Redux商店中有状态,我想将所有isPlaying更改为false。我不知道怎样才能做得更好。以下是我到目前为止所做的

const INITIAL_STATE = {
  isPlaying: true,
  allLangs: [
        {
          shortName: 'es',
          fullName: "spanish",
          order: 0,
          isPlaying: false
        }, {
          shortName: 'pt',
          fullName: "portuguese",
          order: 0,
          isPlaying: false
        },
        {
          shortName: 'gb',
          fullName: "english",
          order: 0,
          isPlaying: true
        }
      ]
  }

return update(state,
      {
        $merge: {isPlaying: false},
        allLangs: {
          [0]: {
            $merge: {isPlaying: false}
          },
          [1]: {
            $merge: {isPlaying: false}
          },
          [2]: {
            $merge: {isPlaying: false}
          }
        }
      }); 

所以我的问题是:有没有比单独调用所有索引更好的方法呢?

鉴于您当前的数据结构,如果您想将
isplay
的每个实例都设置为false,那么您所拥有的是正确的。根据您的用例,以下是一些其他建议:

重置为默认值 假设无论何时将
isplay
设置为false,游戏都将结束,您将开始一个新游戏。然后,最简单的方法可能是直接将状态设置为
initialState

更改数据结构 这取决于您的用例,但我的第一直觉是您的数据结构存在重复。你真的能同时用英语和西班牙语玩游戏吗?如果没有,考虑这样做: 常数allLangs={ es:{ 全名:“西班牙语”, 订单:0, } }

然后,在您的状态中,您将指向活动语言:

const state = {
  isPlaying: false,
  activeLanguage: "es"
}

以这种方式进行重构可以为您提供一个单一的真相来源。

我建议您在单独的数组变量中使用'allLangs'数组,比如说'newAllLangs',并使用map()更改'isplay',最后将'newAllLangs'设置为state。像这样的

我正在考虑您在userAction.js中执行此操作。假设您通过mapStateToProps获得了allLangs,并使用mapDispatchToProps将此数据发送到userAction.js。在userAction.js中,您可以手动填充所有语言并将它们发送回reducer。reducer将根据您从userAction发送的内容更新存储

如果你想要更多的曝光,这是理论部分。你可以做一把小提琴,在这里分享