【发布时间】:2017-07-25 20:31:23
【问题描述】:
有人对使用 Immutable.js 将 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 对象转换为不可变的List 和Record:
https://github.com/jhukdev/immutable-parsejs
不想要Record的可以看源码,方便改。
Record 很不错,因为您可以直接访问属性,这意味着将来如果您想从 ImmutableJs 切换出来,它的前景会更容易
【讨论】: