javascript - Immutable.fromJS() 不深

标签 javascript immutable.js

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/

相关文章:

javascript - 设置 firebase 后出现以下错误 : Client doesn't have permission to access the desired data

javascript - 如何在 immutable.js 中合并 map ?

javascript - 如何在嵌套的 Immutable.js 映射和列表中执行推送操作。?

javascript - 如何将新项目推送到 immutableJS 中的深层嵌套记录中

Javascript 更新属性

javascript - 如何手动切换 angular-ui-select 下拉列表(单选)

javascript - Newtonsoft日期解析错误(删除一天)

javascript - JS Fetch API 禁用 SSL 证书

javascript - 使用 D3.js 和 Immutable.js

javascript - ImmutableJS - 更新列表中的值