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

Posted

技术标签:

【中文标题】将新的不可变映射值附加到不可变列表【英文标题】:Appending new Immutable Map value to Immutable List 【发布时间】:2021-10-06 17:37:55 【问题描述】:

我有以下一段代码,其中我需要在每次 forEach 迭代中将新的不可变映射值推送到不可变列表。流程按预期进入 if 条件,但没有任何内容被推送到 listOfFiles 列表。 forEach 打印列表末尾的控制台为 List[0]。

任何提示,关于这里应该纠正什么以使其正常工作?

代码

const formatListOfFilesObjectForAPI = (selectedListOfFileIds, allFilesData) => 

  const listOfFiles = new Immutable.List();
  selectedListOfFileIds.forEach(fileId => 
    const fileObject = allFilesData.getIn([fileId, 'result']);
    if(fileObject && fileObject.size > 0) 
      if(fileObject.get('provider') === 'intranet') 
        listOfFiles.push(new Immutable.Map(
          file_id: fileObject.get('fileId'),
          provider: fileObject.get('provider')
        ));
       else 
        listOfFiles.push(new Immutable.Map(
          file_id: fileObject.get('fileId'),
          provider: fileObject.get('provider'),
          name: fileObject.get('basename'),
          type: fileObject.get('extension'),
          size: fileObject.get('size'),
          version: fileObject.get('version'),
        ));
      
     else 
      listOfFiles.push(new Immutable.Map(
        file_id: fileId,
        provider: 'intranet'
      ));
    
  );

  console.log('listOfFiles', listOfFiles);

  return listOfFiles;
;

【问题讨论】:

【参考方案1】:

你试图改变一个不可变的列表,所以它不会改变是正常的。

如果您检查Immutable documentation,例如push(),您会看到它返回一个新列表 和结果。因此,在您的示例中,您需要将每个 listOfFiles.push 替换为 listOfFiles = listOfFiles.push

或者,使用常规数组,您可以简单地 push() 并将其转换为最后的不可变列表。

【讨论】:

以上是关于将新的不可变映射值附加到不可变列表的主要内容,如果未能解决你的问题,请参考以下文章

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

按值传递可变对象

应用程序崩溃:发送到不可变对象的变异方法

python可变和不可变类型

SDK 8.3 不可变值...只有名为“附加”的变异成员

python中的不可变类型和可变类型