2016-09-01 8 views
9

Próbuję przekonwertować obiekt na wersję odchudzoną za pomocą destrukturyzacji.Zagnieżdżanie obiektu i macierzy destrukturyzacji

Mój obiekt zawiera zagnieżdżoną tablicę, która również zawiera obiekty, z tej tablicy chciałbym tylko kilka pól.

Potrafię wykonać zagnieżdżanie obiektu zagnieżdżonego, a rozkład szyku w porządku, ale nie razem?

Mój obecny try wygląda następująco:

var data = { 
    title: "title1", 
    bar: "asdf", 
    innerData: [ 
     { 
     title: "inner-title1", 
     foo: "asdf" 
     }, 
     { 
     title: "inner-title2", 
     foo: "asdf" 
     } 
    ] 
}; 

var { title, innerData: [ { title} ] } = data; 

console.log(title); 

for (var { title} of innerData) { 
    console.log(title); 
} 

Ale pojawia się komunikat mówiący innerData is not defined.

Wynik Chciałbym może być:

{ 
    title: "title1", 
    innerData: [ 
     { 
     title: "inner-title1" 
     }, 
     { 
     title: "inner-title2" 
     } 
    ] 
}; 
+1

nie tylko 'var {title, innerData} = data;' aby uzyskać tablicę 'innerData' w zmiennej – Bergi

Odpowiedz

2

Można ustawić nazwę zmiennej do identyfikatora innej niż określona innerData; używać .map() lub JSON.stringify(), JSON.parse() filtrować title nieruchomość od innerData obiektów

var {title, titles = data.innerData.map(o => ({title:o.title}))} = data; 

aby utrzymać innerData nazwę zmiennej można użyć tablicy rozpad obiektu

var [title, innerData] = [data.title, data.innerData.map(o => ({title:o.title}))]; 

wykorzystaniem JSON.stringify(), JSON.parse()

var [title, innerData] = JSON.parse(JSON.stringify([data.title, data.innerData], ["title"])); 

Edit

Jeśli wymogiem jest, aby utworzyć tablicę zawierającą wszystkie title właściwości w ciągu data można użyć JSON.stringify() z tablicy zamiennika ustawiony ["title"], JSON.parse(), rozłożone elementem

var data = { 
 
    title: "title1", 
 
    bar: "asdf", 
 
    innerData: [ 
 
     { 
 
     title: "inner-title1", 
 
     foo: "asdf" 
 
     }, 
 
     { 
 
     title: "inner-title2", 
 
     foo: "asdf" 
 
     } 
 
    ] 
 
}; 
 

 
var innerData = JSON.parse(JSON.stringify([data, ...data.innerData], ["title"])) 
 
                     
 
console.log(innerData);

+0

"downvote" opis? – guest271314

+0

@shenku Zobacz zaktualizowany post – guest271314

2

Twój rozpad nie robi tego, co myślisz.

var { title, innerData: [ { title} ] } = data; 

jest (zasadniczo) równoważne

var title = data.title; 
var title = data.innerData[0].title; 

destructuring wyciąga poszczególne wartości, to nie będzie mapować przez tablicę dla Ciebie. Musisz to zrobić ręcznie, jeśli tego chcesz.

+0

Zauważyłem, że myślałem, że perha ps był sposób, że mógłbym je powtórzyć w jednym kroku. Twoje zdrowie. – shenku

1

Zgodnie z sugestią @loganfsmyth, zrobię to w dwóch etapach.

var { title } = data; 

for (var { title } of data.innerData) { 
    console.log(title); 
} 

Edit: moja ostateczne rozwiązanie do budowy nowego obiektu json od starego

const request = { innerData: [] }; 

({ title } = this.data); 

for (const { title} of this.data.innerData) { 
    request.innerData.push({ 
     title 
    }); 
} 
+1

Uwaga, 'data' w odpowiedzi, jeśli różni się od" danych "w pytaniu; Właściwości 'foo' nie występują w' data.innerData'. Czy jest wymagane przypisanie 'title' do' data.title', 'innerData' jako tablicy wartości odpowiadającej wartości' title' z 'data.innerData' bez właściwości' foo'? – guest271314

Powiązane problemy