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

时间:2018-07-04 11:16:18

标签: javascript arrays reactjs redux store

我在Redux Store中有状态,我想将所有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}
          }
        }
      }); 

所以我的问题是:有什么方法可以比分别调用所有索引更好的方法呢?

2 个答案:

答案 0 :(得分:0)

鉴于您当前的数据结构,如果要将{ "_id" : "Q6GinQQKKnfA7FrAT", "instrument_token" : NumberInt(11552514), "last_price" : 10711.8, "buy_quantity" : NumberInt(714225), "sell_quantity" : NumberInt(488775), "buySellRatio" : 1.4612551787632346, "timestamp" : "2018 07 03 07:54:52", "oi" : NumberInt(20539500), "oi_day_high" : NumberInt(20539500), "oi_day_low" : NumberInt(19809750) } { "_id" : "Dwez3LuqLsB6MZRnB", "instrument_token" : NumberInt(11552002), "last_price" : NumberInt(26329), "buy_quantity" : NumberInt(185520), "sell_quantity" : NumberInt(201080), "buySellRatio" : 0.9226178635369008, "timestamp" : "2018 07 03 07:54:52", "oi" : NumberInt(2163040), "oi_day_high" : NumberInt(2170680), "oi_day_low" : NumberInt(2018440) } { "_id" : "tcDfqRPk3qs2mYmow", "instrument_token" : NumberInt(11552514), "last_price" : 10711.95, "buy_quantity" : NumberInt(713775), "sell_quantity" : NumberInt(490125), "buySellRatio" : 1.4563121652639632, "timestamp" : "2018 07 03 07:54:53", "oi" : NumberInt(20539500), "oi_day_high" : NumberInt(20539500), "oi_day_low" : NumberInt(19809750) } 的每个实例设置为false,那么您所拥有的是正确的。根据您的用例,还有一些其他建议:

重置为默认值

比方说,每当您将isPlaying设置为false时,游戏结束,并且您正在开始新游戏。然后,最简单的操作可能就是直接将状态设置为isPlaying

更改数据结构

这取决于您的用例,但是我的第一个直觉是您的数据结构具有重复性。您真的可以同时玩英语和西班牙语的游戏吗?如果没有,请考虑执行以下操作: const allLangs = {   es:{     fullName:“西班牙语”,     顺序:0,   } }

然后,在您的状态下,您将指向当前使用的语言:

initialState

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

答案 1 :(得分:0)

我建议您将'allLangs'数组放在单独的数组变量中,让我们说'newAllLangs'并使用map()更改'isPlaying',最后设置此'newAllLangs'到状态。像这样的东西。

我正在考虑您正在userAction.js中进行此操作。因此,假设您通过mapStateToProps获得了allLangs,并通过使用mapDispatchToProps将数据发送到userAction.js。在userAction.js中,您可以处理allLangs并将它们发送回reducer。然后reducer将根据您从userAction发送的内容更新商店。

这是理论上的部分,如果您想了解更多。您可以在小提琴中分享。