从 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
个对象转换为不可变的 List
和 Record
:
https://github.com/jhukdev/immutable-parsejs
不想要Record
的可以看看源码,改起来很方便
Record
很好,因为您可以直接 属性 访问,这意味着将来如果您想从 ImmutableJs 切换出来,它会更容易
有没有人建议使用 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 切换出来,它会更容易