【问题标题】:fromJS to nested ordered maps with Immutable.js?fromJS 到带有 Immutable.js 的嵌套有序映射?
【发布时间】:2017-07-25 20:31:23
【问题描述】:

有人对使用 Immutable.js 将 js 列表深度转换为嵌套有序映射的最佳方法提出建议吗?

【问题讨论】:

    标签: immutable.js ordered-map


    【解决方案1】:

    您可以创建自己的custom conversion。比如把JS对象变成Immutable.OrderedMap

    function fromJSOrdered(js) {
      return typeof js !== 'object' || js === null ? js :
        Array.isArray(js) ? 
          Immutable.Seq(js).map(fromJSOrdered).toList() :
          Immutable.Seq(js).map(fromJSOrdered).toOrderedMap();
    }
    

    【讨论】:

    • 感谢艾伯特!我认为我缺少的是在地图上对 fromJSOrdered 的递归调用
    【解决方案2】:

    @Albert Olivé 的回复对我的案例使用有问题,因为递归和缺乏主要上下文。我已经尝试使用第二个上下文参数来映射,但又出现了问题。 最后我意识到我并不关心子图中的顺序,只是在传递给函数的主图中,以维护服务器在 html 列表上提供的顺序。所以我以这种方式将函数更改为不递归:

     fromJSOrdered(js) {
    
        if (typeof js !== 'object' || js === null || Array.isArray(js)) { 
          return  fromJS(js);
        }
        return new OrderedMap(fromJS(js));
      }
    

    【讨论】:

      【解决方案3】:

      fromJS 有第二个参数称为reviver,可以完全用于此目的。

      import Immutable from 'immutable';
      const reviver = (key, value) => 
          Immutable.Iterable.isKeyed(value) ? value.toOrderedMap() : value.toList();
      const data = Immutable.fromJS(js, reviver);
      

      【讨论】:

        【解决方案4】:

        我最近实际上发布了一个包,它可以将对象、数组或Map 对象转换为不可变的ListRecord

        https://github.com/jhukdev/immutable-parsejs

        不想要Record的可以看源码,方便改。

        Record 很不错,因为您可以直接访问属性,这意味着将来如果您想从 ImmutableJs 切换出来,它的前景会更容易

        【讨论】:

          猜你喜欢
          • 2021-07-06
          • 2022-06-15
          • 2019-12-27
          • 2021-03-01
          • 1970-01-01
          • 2016-09-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多