1

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

4

4 回答 4

3

您可以创建自己的自定义转换。例如,将 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();
}
于 2017-03-06T07:24:42.087 回答
1

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

import Immutable from 'immutable';
const reviver = (key, value) => 
    Immutable.Iterable.isKeyed(value) ? value.toOrderedMap() : value.toList();
const data = Immutable.fromJS(js, reviver);
于 2020-03-26T09:21:07.057 回答
0

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

 fromJSOrdered(js) {

    if (typeof js !== 'object' || js === null || Array.isArray(js)) { 
      return  fromJS(js);
    }
    return new OrderedMap(fromJS(js));
  }
于 2018-05-10T07:03:49.230 回答
0

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

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

不想要的可以看一下源码Record,很容易改。

Record的很好,因为您可以直接访问属性,这意味着将来如果您想从 ImmutableJs 切换,这是一个更容易的前景

于 2021-11-24T13:44:59.643 回答