【问题标题】:Retrieve a flattened array of values taken from an object array that exists within a top-level object of which I am given an array从一个对象数组中检索一个扁平的值数组,该对象数组存在于一个顶级对象中,我得到了一个数组
【发布时间】:2017-05-24 10:46:33
【问题描述】:

请随意修改标题,我很难解释和搜索。

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

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

所以我有一组“预订”对象。 每个 Booking 可以在“Day”对象数组中包含天数。 在“Day”对象中有一个“Hours”属性。

我想要做的就是遍历 bookings 数组并输出一个扁平的“小时”值数组(这样我就可以在图表中可视化)。

我确信有一种很好的功能性或其他简洁的方法来执行此操作,而不是使用一系列“for”循环。

有人吗?

【问题讨论】:

  • 至少,你可以为这个问题添加一个经典的方法。
  • 你的意思是我已经尝试过的吗?我使用的解决方案是嵌套的 for 循环,但我在问题中指定我不是在寻找那个答案,而是在寻找更实用的东西

标签: javascript object iteration underscore.js data-munging


【解决方案1】:

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]

【讨论】:

  • 这正是我一直在寻找的 - 有没有你可以提供的非 lo-dash/underscore 变体?
【解决方案2】:

您可以使用 days 数组的值来减少 booking

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

【讨论】:

  • 完美的原生 javascript 实现,非常好地完成了工作。谢谢
【解决方案3】:

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)

【讨论】:

  • 这是我的解决方案 - 基本上是嵌套的 for 循环,我只是想知道是否有一个方便的函数方法。
猜你喜欢
  • 2015-11-12
  • 2020-04-06
  • 2020-08-22
  • 1970-01-01
  • 2019-07-04
  • 2021-05-14
  • 1970-01-01
  • 1970-01-01
  • 2011-07-07
相关资源
最近更新 更多