2015-02-20 15 views
8

Jestem nowy w immutable.js i chciałbym lepiej zrozumieć, jak używać rekordów zaczynając od surowego obiektu JS.Jak utworzyć mapę rekordów z surowego obiektu javascript za pomocą Immutable.js?

Z Immutable.fromJS() mogę stworzyć mapę przechodzącego surowego obiektu, na przykład:

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 jest teraz mapa zawierająca inne mapy, po jednym dla każdego obrazu.

Chciałbym zamiast utworzyć mapę zawierającą rekordy, na przykład za pomocą Image rekord zdefiniowany jako:

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

Jak mogę mieć imagesMap jako mapą ImageRecord s? Czy jest coś, co mogę zrobić, przekazując odświeżacz do fromJS, czy powinienem iść z "starym" podejściem?

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

Odpowiedz

16

Immutable.fromJS ma opcjonalny drugi parametr reviver, które można wykorzystać. Musisz tylko zdecydować, które części obiektu js chcesz zmienić w rekordy.

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

+2

Dzięki, ja również znaleźć w docs że odnowiciel 'key' jest pusty ciąg dla najlepszych obiektów, dzięki czemu jeszcze łatwiej sprawdzić, czy wartość powinna zostać Record. – gpbl