Immutable.fromJS() 没有将我的 JSON 深入转换为不可变对象

Immutable.fromJS() is not deeply converting my JSON to Immutable object

我有 2 个给定的不可变列表,我按如下方式连接它们:

const fruits = Immutable.List(['apple', 'banana']);
const vegetables = Immutable.List(['carrot']);
const groceries = fruits.concat(vegetables);

我使用 map 函数转换数据以获取对象列表,最后使用 fromJS 将其转换为不可变的,如下所示:

const result = groceries.map((item, index) => ({ id: index, item }));
const checkList = Immutable.fromJS({ groceries: result });

所以最终数据是给定的不可变对象JSON:

   {
      "groceries": [
        {
          "id": 0,
          "item": "apple"
        },
        {
          "id": 1,
          "item": "banana"
        },
        {
          "id": 2,
          "item": "carrot"
        }
      ]
    }

我预计 fromJS 会将对象 { groceries: result } 深度转换为不可变对象。但是当我检查 checkList.getIn(['groceries', '0']) 的值时,我得到一个普通的 JSON 对象 {id: 0, item: 'apple`} 而不是预期的不可变映射。

谁能帮帮我为什么会这样

引用 immutableJS repo 中的语句

Immutable.fromJS() is conservative in its conversion. It only converts plain Objects (no custom prototype) to Immutable.Map and true Arrays to Immutable.List. This ensures that exotic objects (Date objects, DOM nodes, user-defined types) don't get converted to Immutable.Map unintentionally.

所以它只转换普通对象。在您使用 fromJS 之前的情况下,数据如下所示:

{
  groceries: <Immutable List>
}

在列表中,每个元素都存储为普通 JSON 对象,如下所示:

{ id: 0, item: 'apple'}

fromJS 将您的数据转换为不可变的,直到它遇到普通对象和真正的数组以外的任何东西。这就是为什么它没有转换不可变列表中的元素,因为它不是真正的数组。

您的问题可以通过在下面的代码中添加 fromJS 来解决

const result = groceries.map((item, index) => fromJS({ id: index, item }));