【问题标题】:Fetching Lowest and Highest Time of the Day from Array从数组中获取一天中的最低和最高时间
【发布时间】:2020-02-02 11:07:31
【问题描述】:

我有一个这样的对象数组

const timings = [{
        monday: { from: "12:00", to: "13:00" },
        tuesday: { from: "11:00", to: "13:00" },
        thursday: { from: "11:00", to: "13:00" },
        friday: { from: "11:00", to: "13:00" },
        saturday: { from: "11:00", to: "13:00" },
    },

    {
        monday: { from: "10:00", to: "17:00" },
        tuesday: { from: "09:00", to: "10:00" },
        thursday: { from: "05:00", to: "13:00" },
        friday: { from: "02:00", to: "13:30" },
        saturday: { from: "11:00", to: "13:00" },
    },

    {
        monday: { from: "13:00", to: "14:20" },
        tuesday: { from: "11:00", to: "13:00" },
        thursday: { from: "11:00", to: "13:00" },
        friday: { from: "11:00", to: "13:00" },
        saturday: { from: "11:00", to: "13:00" },
    },

    {
        monday: { from: "12:00", to: "13:00" },
        tuesday: { from: "11:00", to: "13:40" },
        thursday: { from: "11:00", to: "16:00" },
        friday: { from: "11:00", to: "13:00" },
        saturday: { from: "11:00", to: "13:00" },
        sunday: {from: "00:00", to: "23:59"}
    },
]

我希望输出包含数组中一天中最低和最高的时间

例如输出:

{
    monday: { from: "10:00", to: "17:00" },
    tuesday: { from: "09:00", to: "13:40" },
    thursday: { from: "05:00", to: "16:00" },
    friday: { from: "02:00", to: "13:30" },
    saturday: { from: "11:00", to: "13:00" },
    sunday: {from: "00:00", to: "23:59"}
}

我想出了一个很长的解决方案,但它很长而且效率不高。

我的解决方案

mondayFrom = timings.map(d => (d.monday && d.monday.from))
mondayTo = timings.map(d => (d.monday && d.monday.to))
tuesdayFrom = timings.map(d => (d.tuesday && d.tuesday.to))
// .... rest of the days

这将生成数组,我可以从中找到最小值和最大值,但我觉得它的逻辑很糟糕。

如果有更好的方法,请告诉我。 谢谢

【问题讨论】:

  • 我会使用reduce
  • 请通读help center,尤其是How do I ask a good question?,你最好的办法是做你的研究,search关于SO的相关主题,然后试一试。 如果您在进行更多研究和搜索后遇到困难并且无法摆脱困境,请发布您的尝试minimal reproducible example,并具体说明您遇到困难的地方。人们会很乐意提供帮助。
  • 我可以知道我在这里违反了什么规则吗?
  • 好吧,这取决于这一系列时间是否会改变?多常?用户说如何改变它?你还需要对时间做点别的吗?

标签: javascript node.js momentjs


【解决方案1】:

使用 reduce 让它变得相当简单

const timings = [{
        monday: { from: "12:00", to: "13:00" },
        tuesday: { from: "11:00", to: "13:00" },
        thursday: { from: "11:00", to: "13:00" },
        friday: { from: "11:00", to: "13:00" },
        saturday: { from: "11:00", to: "13:00" },
    },

    {
        monday: { from: "10:00", to: "17:00" },
        tuesday: { from: "09:00", to: "10:00" },
        thursday: { from: "05:00", to: "13:00" },
        friday: { from: "02:00", to: "13:30" },
        saturday: { from: "11:00", to: "13:00" },
    },

    {
        monday: { from: "13:00", to: "14:20" },
        tuesday: { from: "11:00", to: "13:00" },
        thursday: { from: "11:00", to: "13:00" },
        friday: { from: "11:00", to: "13:00" },
        saturday: { from: "11:00", to: "13:00" },
    },

    {
        monday: { from: "12:00", to: "13:00" },
        tuesday: { from: "11:00", to: "13:40" },
        thursday: { from: "11:00", to: "16:00" },
        friday: { from: "11:00", to: "13:00" },
        saturday: { from: "11:00", to: "13:00" },
        sunday: {from: "00:00", to: "23:59"}
    },
]

let result = timings.reduce((a, x) => {
    Object.entries(x).forEach(([dow, obj]) => {
        if(!a[dow]) {
            a[dow] = Object.assign({}, obj);
        } else {
            a[dow].from = a[dow].from < obj.from ? a[dow].from : obj.from;
            a[dow].to = a[dow].to > obj.to ? a[dow].to : obj.to;
        }
    });
    return a;
}, {});

console.log(result);

注意:a[dow] = Object.assign({}, obj); 所以原始对象不会发生变异

【讨论】:

    【解决方案2】:

    这里是一个使用.reduce的例子:

    const timings = [{
            monday: { from: "12:00", to: "13:00" },
            tuesday: { from: "11:00", to: "13:00" },
            thursday: { from: "11:00", to: "13:00" },
            friday: { from: "11:00", to: "13:00" },
            saturday: { from: "11:00", to: "13:00" },
        },
    
        {
            monday: { from: "10:00", to: "17:00" },
            tuesday: { from: "09:00", to: "10:00" },
            thursday: { from: "05:00", to: "13:00" },
            friday: { from: "02:00", to: "13:30" },
            saturday: { from: "11:00", to: "13:00" },
        },
    
        {
            monday: { from: "13:00", to: "14:20" },
            tuesday: { from: "11:00", to: "13:00" },
            thursday: { from: "11:00", to: "13:00" },
            friday: { from: "11:00", to: "13:00" },
            saturday: { from: "11:00", to: "13:00" },
        },
    
        {
            monday: { from: "12:00", to: "13:00" },
            tuesday: { from: "11:00", to: "13:40" },
            thursday: { from: "11:00", to: "16:00" },
            friday: { from: "11:00", to: "13:00" },
            saturday: { from: "11:00", to: "13:00" },
            sunday: {from: "00:00", to: "23:59"}
        },
    ];
    
    const formatTimings = function(timings) {
    
      return timings.reduce(function(result, timing) {
        Object.keys(timing).forEach(function(key) {
          result[key] = {
            from: !result[key] 
              ? timing[key].from 
              : [result[key].from, timing[key].from].sort()[0],
            to: !result[key]
              ? timing[key].to
              : [result[key].to, timing[key].to].sort().reverse()[0]
          };
        })
        return result
      }, {})
    
    }
    
    console.log(formatTimings(timings));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-08
      • 1970-01-01
      • 1970-01-01
      • 2023-01-10
      • 2015-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多