2017-05-24 7 views
0

タイトルを変更することは自由です。説明して検索するのは難しいです。配列が与えられているトップレベルオブジェクト内に存在するオブジェクト配列から取得した値のフラット配列を取得します

var booking = [ 
{ 
    x: "1", 
    y: "2", 
    days: [ 
     { 
      hours: 8 
     },  
    ] 
}, 
{...} 
] 

var hoursBooked = [8, 2, 4, 8, 2, 8, 3, 4]; // this is what I want 

「予約」オブジェクトの配列があります。 各予約は、「Day」オブジェクトの配列内に日数を持つことができます。 'Day'オブジェクトには 'Hours'プロパティがあります。

私がしたいのは、予約配列をループして、 '時間'値のフラットな配列を出力する(グラフで視覚化できるように)。

「for」ループのシーケンスを使用するのではなく、これを行うには機能的な、あるいはそれ以外のきれいなアプローチがあると確信しています。

誰でも?

+0

少なくとも、あなたは質問に対する古典的なアプローチを追加することができます。 –

+0

私はすでに試みたことを意味しますか?私が使用していたソリューションはループのためにネストされていましたが、私はその答えを探していなかったので、代わりに何かもっと機能的なものを指定しました –

答えて

1

を印刷します。

var booking = [{ x: "1", y: "2", days: [{ hours: 8 }, { hours: 4 }, ] }, { x: "3", y: "4", days: [{ hours: 1 }, { hours: 3 }, ] }, { x: "3", y: "4", days: [] }], 
 
    hoursBooked = booking.reduce((r, a) => r.concat((a.days || []).map(d => d.hours)), []); 
 

 
console.log(hoursBooked);

+0

完璧な、バニラのjavascriptの実装と本当にうまくいって仕事を得る。ありがとう –

+0

@aspiring_expert、ありがとうございます。 –

0

var booking = [ 
 
{ 
 
    x: "1", 
 
    y: "2", 
 
    days: [ 
 
     { 
 
      hours: 8 
 
     },  
 
     { 
 
      hours: 2 
 
     } 
 
    ] 
 
}, 
 
{ 
 
    x: "1", 
 
    y: "2", 
 
    days: [ 
 
     { 
 
      hours: 4 
 
     },  
 
    ] 
 
} 
 
] 
 
var hoursBooked = [] 
 
booking.forEach(b=>b.days.forEach(d=>hoursBooked.push(d.hours))) 
 
console.log(hoursBooked)

+0

これは私が持っていた解決策です。便利な機能的アプローチ。 –

2

Lodash 4x

var booking = [ 
{ 
    x: "1", 
    y: "2", 
    days: [ 
     { 
      hours: 8 
     },  
    ] 
}, 
{ 
    x: "1", 
    y: "2", 
    days: [ 
     { 
      hours: 3 
     }, 
     { 
      hours: 5 
     } 
    ] 
} 
]; 


_(booking).map('days').flatten().map('hours').value(); 

あなたはdays配列の値でbookingを減らすことができる

[8, 3, 5] 
+0

これは正確に私が探していたものです - あなたが与えることができる非小文字/アンダースコアの変形はありますか? –

関連する問題