- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
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。数组 bars
和 bazes
是 List
。但是,这些列表中的每个元素仍然是普通 (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/
我使用 knockoutJS,当我使用“fromJS”时出现以下错误 TypeError: Cannot call method 'fromJS' of undefined 我的 JavaScript
我正在尝试使用 komapping 插件将属性转换为可观察的。 我确实有相同类型的对象数组,如下所示: var data =[{ b1: "v1", b2: "b21" }, { b1: "v2",
我想从我的 API 加载大约 10k 条记录 - 这是一个相当大的 JSON,但它并没有那么大,我想将它作为不可变对象(immutable对象)保存到 redux 状态: case GET_ALL:
Immutable.fromJS 的描述是: Deeply converts plain JS objects and arrays to Immutable Maps and Lists. 但这是错
不可变的 js - fromJS:处理文件上传(文件对象数组)似乎不可能转换为不可变的 fromJS做得很好即使是嵌套结构 喜欢: javascript const nested = [ { id:
我创建了一个自定义 fromJS 函数,以便当我将对象转换为不可变对象(immutable对象)时,结果将仅包含 OrderedSet 和 Map(而不是列表和 Map)。 除了在下面的情况下,对象中
我是 typescript 的新手。我一直在尝试将 knockout.mapping 与它一起使用,但是,我无法让它工作。 我已经安装了 knockout 和 knockout.mapping 的库,
当下面的对象被映射时,空""数组中的值在 observable 数组中映射为 false: var d2 = { "values": [{"9", false, "", true, null,
我希望能够查看我的不可变对象(immutable对象)以进行调试。我发现通过单击条目等来查看对象非常困难。理想情况下,我想要的是与 formJS 功能相反的东西 所以, const immutable
我的根 knockout 模型包含 VisitEntries 的集合,每个条目都有一个名为 RoomProfile 的对象。当用户创建访问条目(将房间添加到其访问列表)时,应加载该房间的配置文件数据并
我在我的应用程序中使用 KnockoutJS。今天我遇到错误 Uncaught TypeError: Cannot read property 'fromJS' of undefined在浏览器控制台
我有一个定义为 ko.observableArray([]) 的值,并使用 ko.mapping.fromJS 将来自 ajax 的数据附加到其中。但是,当我再次使用 ko.mapping.fromJ
我正在尝试使用 knockout 映射,但它没有像我预期的那样工作。在这里,我创建了我能做的最简单的 fiddle ,但它不起作用。 我错过了什么吗? https://jsfiddle.net/p48
我想将一些新的计算属性附加到从 REST 服务返回的复杂 json 对象。这可以通过 KnockoutJS 的 Mapping 插件轻松实现。 但这次我决定选择 AngularJS。有没有类似knoc
我一直收到错误:Uncaught TypeError: Cannot read property 'fromJS' of undefined这个想法是有 2 个页面,其中是 ui 表示,另一个是 he
我已经更新了一个表,其中包含我模型中的每个条目,并且在删除和添加到数组时触发了两个事件。 hideElement 调用 jquery“fadeOut”,showElement 调用 jquery“fa
使用 ko.mapping.fromJS() 创建的可观察数组具有可观察元素。我怎样才能让它表现得更像 ko.observableArray() ,其中数组是可观察的但数组的元素不是?谢谢。 最佳答案
我知道有一个函数 ko.utils.unwrapObserable() 但它似乎没有解开由 ko.mapping.fromJS() 映射的可观察对象 全部: console.log(listing);
我有一个复杂的对象,我想传递给ko.mapping.fromJS,我的问题是我只希望一个字段是可观察的,但其他属性要么是 null 要么是 non -根据我尝试过的方法存在。 我创建了一个 jsFid
我正在尝试 ko.mapping.fromJS(http://knockoutjs.com/documentation/plugins-mapping.html) 鉴于下面的代码和期望,有人可以向我解
我是一名优秀的程序员,十分优秀!