gpt4 book ai didi

javascript - Immutable.fromJS() 不深

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:31:02 26 4
gpt4 key购买 nike

Immutable.fromJS 的描述是:

Deeply converts plain JS objects and arrays to Immutable Maps and Lists.

但这是错误的。我有一个具有以下结构的对象。大写的项目是 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

Immutable.fromJS(foo) 的结果是一个 Map。数组 barsbazesList。但是,这些列表中的每个元素仍然是普通 (ES6) 对象。每个 Baz 的 bars 属性是一个数组,而不是列表。

是我做错了什么,还是文档不正确?

也许 ES6 对象不支持深度特征?如果是这样的话,我怎样才能使我的对象深度不可变?

更新:

这有效但感觉有点恶心:Immutable.fromJS(JSON.parse(JSON.stringify(foo)))

最佳答案

docs for fromJS 中的第一句话是:

Deeply converts plain JS objects and arrays to Immutable Maps and Lists.

如果 Foo、Bar 和 Baz 是 ES6 类,那么它们既不是普通的 JS 对象也不是数组——它们是类的实例。所以,不,文档没有错。

顺便说一句,如果 Immutable.fromJS 自动将它遇到的任何对象转换为普通 JS 对象,正如您似乎期望的那样,这对大多数用户来说将是非常令人惊讶的行为,并且一点都不理想。

但由于这是您想要的行为,您会很高兴知道 Immutable wiki 有 a section on this exact topic ,我将在这里复制以供后代使用:

Here is an example which will convert any Object, including exotic Objects, to Immutable.Map:

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();
}

这很简单。事实上,它完全按照 promise 工作,正如您通过运行以下代码片段所看到的那样。

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());
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.js"></script>

关于javascript - Immutable.fromJS() 不深,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40661729/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com