javascript - 在 Immutable.js 中解析嵌套记录

标签 javascript immutability immutable.js

假设我使用 Immutable.js 定义了以下记录:

var Address = Immutable.Record({street: '', city: '', zip: ''});
var User = Immutable.Record({name: '', address: new Address()});

如何将纯 javascript 对象转换为用户记录?我尝试了以下但它没有产生预期的输出:

var user = new User({name: 'Foo', address: {street: 'Bar', city: 'Baz'}});
// => Record { "name": "Foo", "address": [object Object] }

我知道可以显式创建地址记录:

var user = new User({name: 'Foo', address: new Address({street: 'Bar', city: 'Baz'})});
// => Record { "name": "Foo", "address": Record { "street": "Bar", "city": "Baz", "zip": "" } }

但这不是我正在寻找的解决方案。想象一下,您有多层嵌套的 Records 并希望将数据存储/检索为 JSON(例如在数据库中)。我想使用实际的用户记录结构作为重新创建嵌套记录的模式信息。或者是否有更好的方法来表示嵌套和结构化的不可变数据?

最佳答案

Record 结构的预期用途不是验证所提供数据的结构,只是确定允许的键集并在未提供时提供默认值。

因此使用您的示例,如果您在不提供地址的情况下初始化记录,您将获得地址的正确 Immutable.Record 对象:

var user = new User({name: 'Foo'});
// => Record { "name": "Foo", "address": Record { "street": "", "city": "", "zip": "" } }

一种骇人听闻的方法是在Immutable.fromJS 方法上编写一个带有自定义reviver 函数的包装器: p>

Immutable.Record.constructor.prototype.fromJS = function(values) {
  var that = this;
  var nested = Immutable.fromJS(values, function(key, value){
    if(that.prototype[key] && that.prototype[key].constructor.prototype instanceof Immutable.Record){return that.prototype[key].constructor.fromJS(value)}
    else { return value }
  });
  return this(nested);
}

然后你可以像这样使用它:

var user = User.fromJS({name: 'Foo', address: {street: 'Bar', city: 'Baz'}});

// => User { "name": "Foo", "address": Record { "street": "Bar", "city": "Baz", "zip": "" } }

但是,如果您想正确检查您的数据结构,我建议您将 Immutable.js 与一些静态类型检查器结合使用,例如 http://flowtype.org/http://www.typescriptlang.org/

关于javascript - 在 Immutable.js 中解析嵌套记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29763280/

相关文章:

javascript - 不可变 typescript 类型定义 : why is concat operating on any?

javascript - 以编程方式移动 Gridster 小部件

javascript - Javascript fetch 中 URL 中异步函数的值

javascript - 在 redux reducer 中如何更新数组对象内的 1 个属性

javascript - 使用 Immutable.js 的 mergeDeep() 时丢失属性

javascript - Immutable.js 记录上的方法会复制吗?

javascript - 为什么 TypeScript 无法在编译时检测到不匹配的类型以及如何修复它?

Rails 重定向后 Javascript 未执行

javascript - 使用 ES6,如何在 for 循环结束时返回?

reactjs - useEffect 中的状态总是指 React Hooks 的初始状态