2017-05-24 14 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

你的意思是说我已经尝试了什么?我使用的解决方案是嵌套for循环,但我在问题中指定我没有寻找答案,而是更多的功能 –

回答

1

你可以减少bookingdays阵列的值。

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

将打印

[8, 3, 5] 
+0

这恰恰就是我在寻找的东西 - 有没有可以给你的非破折号/下划线变体? –