不可变js-创建或更新嵌套在映射中的列表

immutable js - create or update a list nested inside a map

本文关键字:映射 列表 嵌套 js- 创建 更新 不可变      更新时间:2023-09-26

我必须修改一个挑选资产的系统,以允许用户挑选多个资产。目前,我们将一个资产ID添加到生产ID映射中,如下所示:

.setIn(['newRequest', 'productionAssets', action.productionId], action.assetId)

如果它是第一个,我如何修改它,以便创建一个新列表,如果不是第一个,则如何追加?

我最终做了两轮。也许有一个更简洁的版本,但这适用于

if (s.hasIn(['newRequest', 'productionAssets', action.productionId])) {
        return s
          .updateIn(['newRequest', 'productionAssets', action.productionId], (prodAssets) => prodAssets.push(action.assetId))            
      } else {
        return s
          .setIn(['newRequest', 'productionAssets', action.productionId], fromJS([action.assetId]))             
      }

你可以做这样的一行:

return s.updateIn(['newRequest', 'productionAssets', action.productionId], l => (l || List()).push(fromJS(action.assetId)));

这样,如果路径['newRequest', 'productionAssets', action.productionId]中的值是undefined,您可以用List()初始化它,然后用push()初始化新项目。如果列表已经存在,您只需在其中添加一个新项目。