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は、画像ごとに 1 つずつ、他のマップを含むマップになりました。

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には、使用できるオプションの 2 番目のパラメーター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 に答える