从 JS 到带有 Immutable.js 的嵌套有序地图?

fromJS to nested ordered maps with Immutable.js?

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

您可以创建自己的 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();
}

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

 fromJSOrdered(js) {

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

fromJS 有第二个参数reviver,正好可以用于此。

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

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

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

不想要Record的可以看看源码,改起来很方便

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