不可变列表的映射仅更新最后一个索引

Posted

技术标签:

【中文标题】不可变列表的映射仅更新最后一个索引【英文标题】:Map of immutable list is only updating the last index 【发布时间】:2021-07-27 21:03:55 【问题描述】:

我有这个声明:

  const players = immutable.fromJS(
    enabled: true,
    contract,
  )

我有一个复选框,基本上将enabled 切换为true/false

我现在也有“全部启用”复选框:

playerKeys && playerKeys.map((playerKey, i) => 
          players.set(playerKey, players.get(playerKey).set('enabled', e.target.checked))
        )

我不确定我在使用这个函数时做错了什么,但它只会更改列表的最后一个索引。

有没有办法修复我的“全部启用”复选框,以便更新我列表中的所有项目?

【问题讨论】:

【参考方案1】:

我有几乎相似的经历,但在我的情况下,直到我意识到什么都没有更新:更新不可变 Map 或 List 会返回另一个不可变 Map 或 List,不会修改原始 List 或 Map。显然这就是不可变的意思。

所以首先你应该创建 players 变量,然后

playerKeys && playerKeys.map((playerKey, i) => 
    players = players.get(playerKey).set('enabled', e.target.checked)
)

这应该是理想的工作!

【讨论】:

【参考方案2】:

你在设置一个值的同时设置一个值,你可能只是漏掉了一个“)”

players.set(playerKey, player.get(playerKey).set('enabled', e.target.checked))

这条指令 players.get(playerKey).set('enabled', e.target.checked) 不返回任何内容,因此您没有为父函数设置任何内容player.set

[编辑]

playerKeys && playerKeys.map((playerKey, i) => 
    players.get(playerKey).set('enabled', e.target.checked)
)

【讨论】:

即使我使用 forEach 也一样 @ajbee 更新了答案。如果触发了 e.target.checked,只需将 event.target 的值设置为列表。无需从玩家那里获取价值,因为价值是绝对的,您想将其应用于所有玩家

以上是关于不可变列表的映射仅更新最后一个索引的主要内容,如果未能解决你的问题,请参考以下文章

数据类型总结

将新的不可变映射值附加到不可变列表

Python基础之基本数据类型的总结

数据类型分类

python 字符串和容器总结

当我们创建空的不可变列表/集合/映射时,是否有任何实际的应用程序/用例