Tim*_*ott 3 javascript immutable.js
描述Immutable.fromJS是:
将普通JS对象和数组深深地转换为不可变映射和列表.
但那是错的.我有一个具有以下结构的对象.大写项目是ES6课程.
Foo
prop1
prop2
bars
Bar
prop1
prop2
Bar
prop1
prop2
bazes
Baz
prop1
prop2
bars
Bar
prop1
prop2
Bar
prop1
prop2
Baz
prop1
prop2
bars
Bar
prop1
prop2
Bar
prop1
prop2
Run Code Online (Sandbox Code Playgroud)
结果Immutable.fromJS(foo)是一张地图.阵列bars和bazes是List秒.但是,这些列表中的每个元素仍然是一个普通(ES6)对象.bars每个Baz 的属性是一个数组,而不是列表.
我做错了什么,或者文档不正确?
也许ES6对象不支持深层功能?如果是这样的话,我怎样才能使我的对象变得不可变?
更新:
这有效,但感觉有点粗糙: Immutable.fromJS(JSON.parse(JSON.stringify(foo)))
文档中的fromJS第一句话是:
将普通JS对象和数组深深地转换为不可变映射和列表.
如果Foo,Bar和Baz是ES6类,那么它们既不是普通的JS对象也不是数组 - 它们是类的实例.所以,不,文档不是不正确的.
顺便说Immutable.fromJS一句,如果将它遇到的任何对象自动转换为普通的JS对象,就像你期望的那样,那对大多数用户来说这将是非常令人惊讶的行为,而且根本不是理想的.
但是既然这就是你想要的行为,你会很高兴知道不变的wiki有一个关于这个确切主题的部分,我将在这里复制以供后人使用:
这是一个将任何Object(包括外来对象)转换为以下内容的示例
Immutable.Map:Run Code Online (Sandbox Code Playgroud)function fromJSGreedy(js) { return typeof js !== 'object' || js === null ? js : Array.isArray(js) ? Immutable.Seq(js).map(fromJSGreedy).toList() : Immutable.Seq(js).map(fromJSGreedy).toMap(); }
这很简单.而且,实际上,它的工作原理与您承诺的完全相同,正如您可以通过运行以下代码段看到的那样.
class Foo {
constructor(name, ...children) {
this.name = name;
this.children = children;
}
}
class Bar extends Foo {}
class Baz extends Foo {}
const myBar = new Bar("myBar", new Baz("myBaz1"), new Baz("myBaz2"));
const myFoo = new Foo("myFoo", myBar);
function fromJSGreedy(js) {
return typeof js !== 'object' || js === null ? js :
Array.isArray(js) ?
Immutable.Seq(js).map(fromJSGreedy).toList() :
Immutable.Seq(js).map(fromJSGreedy).toMap();
}
console.log(fromJSGreedy(myFoo).toString());Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.js"></script>Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3034 次 |
| 最近记录: |