2016-11-03 55 views
13

mam:ES6/Następna: obiekt demontażu struktury z resztą - grupowanie

const props = { 
    gallery: [], 
    select:() => null, 
    one: 1, 
    two: 2, 
} 

mogę destructure go:

const {gallery, select, ...other} = props 

będę miał trzy zmienne teraz:

  • galeria = []
  • wybrać = () => null
  • inne = {one: 1,two: 2}

Czy możliwe jest destucture Do określ grupowania?

Coś takiego (to nie będzie działać, ale mam nadzieję, że jest oczywiste, aby zobaczyć, co staram się robić):

const {{gallery, select}: specific, ...other} = props 

Więc mam 2 zmienne:

  • specyficzne = {gallery: [], select:() => null}
  • inne = {one: 1,two: 2}

mogę go rozwiązać na poziomie wyższym i budować rekwizyty w ten sposób:

const props = { 
    specific: { 
    gallery: [], 
    select:() => null, 
    }, 
    other: { 
    one: 1, 
    two: 2, 
    } 
} 

Ale ja po prostu zastanawiasz się, czy jest to możliwe ze rozpad.

+0

Prawdopodobnie można zrobić z [właściwości rozprzestrzeniania] (https://github.com/sebmarkbage/ecmascript-rest-spread#spread-properties), ale to nie jest dostępny w ES6 jeszcze –

+0

@SamiKuhmonen To nigdy nie będzie dostępne w ES6. Specyfikacja ES6 została już sfinalizowana. –

+0

@Gothdo Niejednoznaczne sformułowanie, chodziło mi o to, że nie jest jeszcze dostępny w wersji ES 6, ale może być w późniejszych wersjach. –

Odpowiedz

8

Co z tym? others zawiera również dane specific i muszę najpierw uzyskać dostęp do props (może to można poprawić), ale myślę, że zasadniczo grupuje się podczas destrukturyzacji. To działa, ponieważ można przypisać wartość domyślną, gdy atrybut nie istnieje:

const props = { 
 
    gallery: [], 
 
    select:() => null, 
 
    one: 1, 
 
    two: 2, 
 
} 
 

 
const {gallery : gal, select : sel} = props; 
 
const {specific: specific={gallery: gal, select: sel}, ...others} = props; 
 

 
console.log(specific); 
 
console.log(others);

EDIT

Można również zmienić

const {gallery : gal, select : sel} = props; 
const {specific: specific={gallery: gal, select: sel}, ...others} = props; 

z:

const {specific: specific={gallery: props.gallery, select: props.select}, ...others} = props; 

jeśli chcesz go w jednym wierszu.

Również, maioman's answer rozwiązuje problem, o którym wspomniałem z others zawierający dane specific i nie ma bezpośredniego dostępu do rekwizytów.

5

Stretching składnia (i czytelność) do granicy można to zrobić:

(objaśnienie do kodu jest w komentarzach)

const props = { 
 
    gallery: [], 
 
    select:() => null, 
 
    one: 1, 
 
    two: 2, 
 
} 
 

 
/** destructuring assignment **/ 
 
const { 
 
    gallery, //extract the gallery prop 
 
    select, //extract the select prop 
 
    specific: specific={gallery, select}, 
 
    // create `specific` setting gallery and select props through default value assignment 
 
    ...others // assign to others the rest of non extracted props properties 
 
} = props; 
 

 
console.log(specific); 
 
console.log(others);

W końcu dojeżdżamy obiekt gallery i select w zakresie, ale udało nam się uczynić je również właściwościami nowego obiektu specific.

Wykorzystanie ostrzeżenie: obiekt spread jest jeszcze propozycja

+0

Jestem całkiem nowy w stackoverflow, więc nie jestem pewien i może się mylę z moim założeniem, ale wygląda na to, że użyłeś mojej odpowiedzi i zmieniłeś ją ... nie powinieneś komentować w mojej, zamiast pisać nowa odpowiedź, jeśli tak jest? –

+0

@ CésarLandesa nawet jeśli ułamek ma ten sam zestaw danych, rozwiązanie jest inne, więc IMHO jest w porządku ... – maioman

+0

Ale rozwiązanie opiera się na tym samym pomyśle, aby rozwiązać główny problem: użycie wartości domyślnej do grupowania podczas destrukturyzacji ... na pewno ulepszyliście tę koncepcję, ale na podstawie mojego kodu i głównej idei. Sądzę, że to kwestia perspektywy, ale dla mnie wygląda to na modyfikację mojej idei, a nie na wystarczająco różne rozwiązanie. –