Immutable.js在Map中更新值多个键

时间:2017-01-16 08:16:35

标签: react-redux immutable.js

我正在尝试使用Immutable.js。所以我使用了Map对象,前面有两个字段。

const initialState = Map({
    isUserAuthorized : false,
    pending : false
});

我想更新两者。我怎么能这样做?我尝试使用像这样的标准Update方法:

state.update( "isUserAuthorized", () => true, "pending", () => false);

但它不是以某种方式工作。所以我只有一个想法 - 只更新特定的密钥,之后对其他密钥执行相同的操作并返回结果。

但我认为这不是一个完美的想法。也许存在其他正常变体?谢谢你的帮助!

P.S。我发现它可以通过设置 withMutations 来完成,如:

initialState.withMutations(map => {
            map.set("isUserAuthorized", true).set("pending", false);
        })

但是在Map中更新多个值真的很难吗?

2 个答案:

答案 0 :(得分:4)

您可以使用.set()

const initialState = Map({
    isUserAuthorized : false,
    pending : false
});

initialState = initialState.set('isUserAuthorized', true);
initialState = initialState.set('pending', false);

如果你不想重复它。您可以创建一个函数来传递多个参数。

另一种方法是使用.merge()

const newState = initialState.merge({
    isUserAuthorized: true, 
    pending: false
});

或链接多组:

initialState = initialState.set('isUserAuthorized', true)
    .set('pending', false)
    .set('key3', 'value3'); 

答案 1 :(得分:0)

有点陈旧的帖子,但如果这有助于其他人,我只是不得不在昨天解决这个问题。这就是我最终要做的事情。

如果您想将 all 更改为相同的键,则可以映射。

const initialState = Map({
  isUserAuthorized : false,
  pending : false
});

const newState = initialState.map(() => true)
// { isUserAuthorized: true, pending: true }

如果您要设置特定键,则在地图中添加条件或三元表达式,仅更新相关内容。这是一个快速而又肮脏的例子。

const initialState = Map({
  isUserAuthorized : false,
  pending : false,
  dontChangeMe: false
});

const newState = initialState.map((val, key) => (
  key === 'isUserAuthorized' || key === 'pending' ? true : value
)
// { isUserAuthorized: true, pending: true, dontChangeMe: false }

如果你想变得聪明并且可以重复使用,你可以制作一个curried实用程序来传递目标键列表,然后只需调用你想要它们的值。