【问题标题】:How to organize a javascript object that contains store hours?如何组织包含商店营业时间的 javascript 对象?
【发布时间】:2014-09-02 10:26:02
【问题描述】:

如果我有一个带有类似这样的商店信息的对象。

storeHours:
0:
 day: Sunday
 Open: 9:00am
 close: 6:00pm
0:
 day: Monday
 Open: 8:00am
 close: 10:00pm
0:
 day: Tuesday
 Open: 8:00am
 close: 10:00pm
0:
 day: Wednesday
 Open: 8:00am
 close: 10:00pm
0:
 day: Thursday
 Open: 8:00am
 close: 10:00pm
0:
 day: Friday
 Open: 8:00am
 close: 10:00pm
0:
 day: Saturday
 Open: 9:00am
 close: 6:00pm

我应该编写什么函数来获得可以给我的输出

simplestoreHours:
0:
 Days: Monday-Friday
 open: 8:00am
 close: 6:00pm 
1: 
 Days: Saturday-Sunday
 open: 9:00am
 close: 6:00pm

而且所有时间都是格式化的 momentjs 对象,因此可以使用 momentjs。

我最初的想法是做一个循环并让每个元素相互检查。如果开盘和关盘时间一样,那就把天连起来吧,不过我觉得这不是很聪明。

【问题讨论】:

  • 嗯:循环元素,您立即将第一个元素添加到对象list(其中包含天数列表,以及 1 个打开+1 个关闭时间),然后对于循环中的每个连续项目您检查它是否与list 中的打开/关闭相同。如果是,则将其添加到该项目,如果不是,则在 list 中添加新记录
  • @grasshopper,您尝试过任何提供的解决方案吗?如果任何符合您的要求,请将答案标记为正确
  • @Evgeniy 感谢您的评论提醒我,该功能完美运行我在前端使用了一个 ng-switch 来获取“All week”、“weekdays”和“Weekends”等输出
  • Np,很高兴为您提供帮助,如果您需要更新 Days 类似 'Saturday-Sunday' -> 'Weekends' 的文本,您可以使用类似 var shortStr = { 'Saturday-Sunday' : 'weekends', 'Monday-Friday': 'weekdays','Monday-Sunday': 'All week' } 的帮助对象并更新 Days: [.. ] 在最后一次迭代中,例如 Days: shortStr[[memo.days[key][0].name, memo.days[key][memo.days[key].length-1 ].name].join('-')]

标签: javascript function object momentjs


【解决方案1】:

reduce数组方法可以帮到你。

  1. 我们必须迭代初始日期对象。
  2. 按键将天数和工作时间分组到 2 个辅助数组中。我使用了串联的打开和关闭时间
  3. 在范围子数组中保持打开和关闭时间
  4. 由于我们不确定按星期几排序的初始数组,我已将日期索引添加到天分组数组中。
  5. 在最后一次迭代中,让我们通过我们拥有的范围并使用范围键查找天数,对其进行排序,将 Days 属性创建为连接的第一个和最后一个排序天数数组并保存组合对象。

    var groupedObject = obj.reduce(function (memo, item, i, array) {
        var key = item.open+item.close;
    
        memo.ranges[key] = memo.ranges[key] || {};
        memo.days[key] = memo.days[key] || [];
    
        memo.ranges[key] = { open: item.open, close: item.open };
    
        memo.days[key].push({
            index: ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'].indexOf(item.day),
            name: item.day
        })
    
        if (i == array.length-1 ) {
            for (var key in memo.ranges) {
                if (memo.ranges.hasOwnProperty(key)) {
    
                    memo.days[key].sort(function(a,b) { return a.index - b.index });
    
                    memo.grouped.push({
                        Days: [
                            memo.days[key][0].name, 
                            memo.days[key][memo.days[key].length-1 ].name
                        ].join('-'),
                        open: memo.ranges[key].open,
                        close: memo.ranges[key].close
                    });
                }
            }
        }
    
      return memo
    
    }, { ranges: {}, days: {}, grouped: [] });
    
    console.log(groupedObject.grouped);
    

就是这样)

【讨论】:

    【解决方案2】:

    你可以这样做:

    var storeHours = [
        {day: 'Sunday', open: '9:00am', close: '6:00pm' },
        {day: 'Monday', open: '8:00am', close: '10:00pm' },
        {day: 'Tuesday', open: '8:00am', close: '10:00pm' },
        {day: 'Wednesday', open: '8:00am', close: '10:00pm' },
        {day: 'Thursday', open: '8:00am', close: '10:00pm' },
        {day: 'Friday', open: '8:00am', close: '10:00pm' },
        {day: 'Saturday', open: '9:00am', close: '6:00pm' }
    ];
    
    function sort() {
    
    var daysSorted = [];
    
    for (var dayCounter = 0, length = storeHours.length; dayCounter < length; dayCounter++)     {
    
        var open = storeHours[dayCounter].open,
            close = storeHours[dayCounter].close,
            name = storeHours[dayCounter].day,
            found = false;
    
        for (var sortedDayCounter = 0, lengthSorted = daysSorted.length; sortedDayCounter < lengthSorted; sortedDayCounter++) {
    
            var sortedOpen = daysSorted[sortedDayCounter].open,
                sortedClose = daysSorted[sortedDayCounter].close;
    
            if (sortedOpen === open && sortedClose == close) {
    
                daysSorted[sortedDayCounter].day += ', ' + name;
                found = true;
    
            }
    
        };
    
        if (!found) {
            daysSorted.push(storeHours[dayCounter]);
        }
    
    };
    
    return daysSorted;
    
    }
    
    console.log(sort());
    

    无论如何,我建议您将打开和关闭日期视为日期类型,而不是字符串。

    希望这会有所帮助,

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-09
      • 2010-10-20
      • 2011-11-09
      • 2014-05-31
      • 1970-01-01
      • 2020-11-14
      • 2012-01-21
      • 1970-01-01
      相关资源
      最近更新 更多