【问题标题】:How to create a map of records from a javascript raw object with Immutable.js?如何使用 Immutable.js 从 javascript 原始对象创建记录映射?
【发布时间】:2015-02-23 22:01:14
【问题描述】:

我是 immutable.js 的新手,我想更好地了解如何使用从原始 JS 对象开始的记录。

使用Immutable.fromJS(),我可以创建一个传递原始对象的地图,例如:

var images = {
   "1": {
    id: "1",
    urls: ["/medium/1.jpg", "/large/1.jpg"]
   },
   "2": {
    id: "2",
    urls: ["/medium/1.jpg", "/large/1.jpg"]
   }
  }

var imagesMap = Immutable.fromJS(images);

imagesMap 现在是一张包含其他地图的地图,每张图片一个地图。

我想创建一个包含记录的地图,例如使用定义为的Image 记录:

var ImageRecord = Immutable.Record({ id: undefined, urls: undefined })

我怎样才能将imagesMap 用作ImageRecords 的映射?我可以将复活者传递给fromJS,还是应该采用“旧”方法?

// old approach
var imagesMap = Immutable.Map()
for (key in images) {
   imagesMap.set(key, new ImageRecord(images[key]))
}

【问题讨论】:

    标签: javascript immutability immutable.js reviver-function


    【解决方案1】:

    Immutable.fromJS 有一个可选的第二个参数reviver,您可以使用它。你只需要决定你想把js对象的哪些部分变成记录。

    var images = {
       "1": {
        id: "1",
        urls: ["/medium/1.jpg", "/large/1.jpg"]
       },
       "2": {
        id: "2",
        urls: ["/medium/1.jpg", "/large/1.jpg"]
       }
      };
    
    var ImageRecord = Immutable.Record({ id: "0", urls: [] })
    
    var imagesMap = Immutable.fromJS(images, function(key, value) {
      // This check should be replaced by a better way to know that
      // we really want image records
      if(/^[0-9]+$/.test(key)) {
        return new ImageRecord(value)
      }
      return value
    });
    
    // Verify that it's really a record
    console.log(imagesMap.get("2").toJS())
    console.log(imagesMap.get("2").delete("urls").toJS())
    

    http://jsbin.com/ronomibano/4/edit

    【讨论】:

    • 谢谢,我还在文档中发现 reviver key 是顶级对象的空字符串,这使得检查值是否应该成为记录变得更加容易。
    猜你喜欢
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 2022-01-22
    • 2020-07-21
    相关资源
    最近更新 更多