代码之家  ›  专栏  ›  技术社区  ›  davidkomer

不可变的普通对象中的深度访问

  •  2
  • davidkomer  · 技术社区  · 6 年前

    考虑以下示例:

    const stickers = 
      new OrderedMap().set(1, {hero: "batman", name: "Bruce"});
    
    stickers.getIn([1]); //=> { hero: 'batman', name: 'Bruce' }
    
    stickers.getIn([1, "hero"]); //=> undefined
    

    为什么第二次的结果 getIn 未定义?

    ImmutableJS上的文档状态:

    普通JavaScript对象或数组可以嵌套在不可变的对象中。js集合和getIn()也可以访问这些值

    所以,如果 OrderedMap 是一个普通javascript对象或一个不可变集合-但是,如果我们首先将该普通对象转换为不可变集合,那么我们可以看到bug消失了:

    const stickers = 
      new OrderedMap().set(1, fromJS({hero: "batman", name: "Bruce"}));
    
    stickers.getIn([1]); //=> { hero: 'batman', name: 'Bruce' }
    
    stickers.getIn([1, "hero"]); //=> 'batman'
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Simon Baumgardt-Wellander    6 年前

    我认为这是因为您正在查看文档,以获取比您使用的库更新的版本。我刚刚用4.0.0-rc版试用了你的代码。9,并按预期工作。

    例如:

    const stickers =
      Immutable.OrderedMap().set(1, {
        hero: "batman",
        name: "Bruce"
      });
    
    console.log(stickers.getIn([1]));
    
    console.log(stickers.getIn([1, "hero"])); // 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/4.0.0-rc.9/immutable.js"></script>