2016-09-01 12 views
9

オブジェクトを非構造化を使用してよりリーンなバージョンに変換しようとしています。ネストされたオブジェクトと配列のデストラクチャリング

オブジェクトにはオブジェクトも含まれるネストされた配列が含まれていますが、この配列からはいくつかのフィールドだけが好きです。

私は入れ子にされたオブジェクトを細かく分解することができます。

私の現在の試みは、次のようになります。

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); 
} 

しかし、メッセージは、私は希望の結果があるかもしれないinnerData is not defined.

を言ってます:

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

JSON.stringify()を使用することができます変数内の 'innerData'配列を取得するには' var {title、innerData} = data; 'と入力してください – Bergi

答えて

2

から新しいJSONオブジェクトを構築します。 、あなたはJSON.stringify()を使用してオブジェクト

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

の配列な破壊を使用することができますinnerData変数名を維持するためにinnerDataオブジェクト

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

からtitleプロパティをフィルタリングする.map()またはJSON.stringify()JSON.parse()を使用JSON.parse()

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

編集

要件がdata内のすべてのtitleのプロパティを含む配列を作成することである場合にのみ行う["title"]に設定代用配列、JSON.parse()、拡散要素

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"の説明はありますか? – guest271314

+0

@shenku最新の記事を見る – guest271314

2

あなたの非構造が何をしていませんあなたは考える。

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

は(基本的に)非構造は、個々の値を引き出す

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

に相当し、それはあなたのために、配列をマッピングしません。それがあなたが望むものなら、手動で行う必要があります。

+0

私はperha psには、私がそれらを1つのステップで繰り返すことができる方法がありました。乾杯。 – shenku

1

@loganfsmythが示すように、私は2つのステップでそれを行います。

var { title } = data; 

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

編集:私の最終的な解決策あなたが定義されてinnerData以外の識別子に変数名を調整することができ、古い

const request = { innerData: [] }; 

({ title } = this.data); 

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

質問の 'data'と異なる場合、Answerの' data'に注意してください。 'foo'プロパティは' data.innerData'に存在しません。 'title'を' data.title'に、 'innerData'を' data.innerData'の 'title'の値に対応する値の配列として' foo'プロパティなしで割り当てる必要がありますか? – guest271314

関連する問題