2016-01-13 18 views
14

ze standardowymi obiektami JS, można użyć destructuring assignment takich jak:Czy mogę użyć zadania destructuring z immutable.js?

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

Jak sugeruje jakiś Flux/Redux ewangelisty, używam immutable.js dla mojej aplikacji; czy mogę użyć destrukturyzacji również na niezmiennej liście/mapie? Oczywiście, można zrobić:

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

ale ten wydaje się mieć zupełnie nieskuteczne jako obiekty rozrastać (ponieważ obiekt musi być głęboko jsified pierwszy).

Odpowiedz

28

Z niezmienną listą, destrukturyzacja działa dość prosto. Dzieje się tak dlatego, że destrukturyzacja tablic działa na wszystkich iterowalnych (Checking whether something is iterable) i nie jest poddawana tylko js Arrayom.

Z Mapą sytuacja jest bardziej skomplikowana. W przeciwieństwie do listy, destrukturyzacja struktur podobnych do mapy jest poddawana tylko zwykłym obiektom JS i niczym więcej. Obecnie nie wydaje się, że ES społeczność uzna to dobry pomysł (patrz https://esdiscuss.org/topic/extensible-destructuring-proposal)

Jednak istnieją babel-plugin, który umożliwia w ten sposób: https://github.com/vacuumlabs/babel-plugin-extensible-destructuring Posiadanie tej wtyczki zainstalowane i włączone w .babelrc, wystarczy załatać niezmienne Mapa mieć metoda [email protected]@get zdefiniowane:

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

i wszystko działa (także zagnieżdżone rozpad lub demontażu struktury z wartościami domyślnymi)

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

Nota prawna: Jestem jednym z autorów wspomnianej powyżej wtyczki.

Powiązane problemy