9

我是 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 })

我怎样才能拥有s 的imagesMap地图ImageRecord?我可以做些什么,将复兴者传递给fromJS,还是应该采用“旧”方法?

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

1 回答 1

17

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

于 2015-02-23T14:01:14.230 回答