2016-01-13 4 views
14

Mit Standardobjekten JS kann man Destrukturierung Zuordnung verwenden wie:Kann ich Destrukturierungsaufträge mit immutable.js verwenden?

let obj = {name: 'james', code: '007'} 
let {name, code} = obj // creates new variables 'name' and 'code' (with the proper values) 

wie von einigen Flux/Redux Evangelist vorgeschlagen, ich immutable.js für meine Anwendung verwenden; kann ich die Destrukturierung auch auf einer unveränderlichen Liste/Karte verwenden? Natürlich könnte man tun:

let obj = immutable.fromJS({name: 'james', code: '007'}) 
let {name, code} = obj.toJS() 

aber ziemlich ineffizient zu sein scheint als die Objekte größer werden (weil das Objekt tief jsified ersten sein muss).

Antwort

28

Mit unveränderlicher Liste funktioniert die Destrukturierung ganz einfach. Dies liegt daran, dass die Destrukturierung von Arrays auf jeder iterierbaren Ebene (Checking whether something is iterable) funktioniert und nicht nur js-Arrays unterzogen wird.

Mit Map ist die Situation komplizierter. Anders als bei List wird die Destrukturierung von Map-ähnlichen Strukturen nur einfachen JS-Objekten unterworfen und nicht mehr. Derzeit scheint es nicht, dass ES Gemeinschaft dies eine gute Idee hält (siehe https://esdiscuss.org/topic/extensible-destructuring-proposal)

Allerdings gibt babel-Plugin gibt, die dies ermöglicht: https://github.com/vacuumlabs/babel-plugin-extensible-destructuring Mit diesem Plugin installiert und aktiviert in .babelrc, können Sie einfach unveränderlich Patch Karte zu haben, eine [email protected]@get Methode definiert:

// main.js, first file loaded 
import {Iterable} from 'immutable'; 
Iterable.prototype[Symbol.for('get')] = function(value) {return this.get(value); }; 

und alles funktioniert (auch verschachtelt Destrukturierung oder Destrukturierung mit Standardwerten)

import {fromJS} from 'immutable'; 
const map = fromJS({author: {name: {first: "John", last: "Doe"}, birthdate: "10-10-2010"}}); 
const {author: {name: {first, last}, birthdate}} = map; 

Haftungsausschluss: Ich bin einer der Autoren des oben erwähnten Plugins.

Verwandte Themen