首页 > 解决方案 > 按星期几分组包含商店营业时间的对象

问题描述

我正在尝试按商店营业时间对天数进行分组。

这就是我的对象的this.customer.customerStoreStandardHours样子。

[
   {
      "dayOfWeek":"Monday",
      "open":"8:00 AM",
      "close":"5:00 PM"
   },
   {
      "dayOfWeek":"Tuesday",
      "open":"8:00 AM",
      "close":"5:00 PM"
   },
   {
      "dayOfWeek":"Wednesday",
      "open":"8:00 AM",
      "close":"6:00 PM"
   },
   {
      "dayOfWeek":"Thursday",
      "open":"8:00 AM",
      "close":"5:00 PM"
   },
   {
      "dayOfWeek":"Friday",
      "open":"8:00 AM",
      "close":"5:00 PM"
   },
   {
      "dayOfWeek":"Saturday",
      "open":"8:00 AM",
      "close":"4:00 PM"
   }
]

这是我到目前为止所拥有的:

storeGroupedHours() {
    if (this.customer.customerStoreStandardHours) {
        const groupedObject = this.customer.customerStoreStandardHours.reduce(function (accumulator, currentValue, i, array) {
            const key = currentValue.open + currentValue.close

            accumulator.ranges[key] = accumulator.ranges[key] || {};
            accumulator.days[key] = accumulator.days[key] || [];
            accumulator.ranges[key] = {
                open: currentValue.open,
                close: currentValue.close
            };

            accumulator.days[key].push({
                index: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'].indexOf(currentValue.dayOfWeek),
                name: currentValue.dayOfWeek
            })

            if (i == array.length - 1) {
                for (let key in accumulator.ranges) {
                    if (accumulator.ranges.hasOwnProperty(key)) {
                        accumulator.days[key].sort(function(a, b) {
                            return a.index - b.index
                        });
                        if (accumulator.days[key][0].name === accumulator.days[key][accumulator.days[key].length - 1].name) {
                            accumulator.grouped.push({
                                days: [
                                    accumulator.days[key][0].name,
                                ].join(''),
                                open: accumulator.ranges[key].open,
                                close: accumulator.ranges[key].close
                            });
                        } else {
                            accumulator.grouped.push({
                                days: [
                                    accumulator.days[key][0].name,
                                    accumulator.days[key][accumulator.days[key].length - 1].name
                                ].join('-'),
                                open: accumulator.ranges[key].open,
                                close: accumulator.ranges[key].close
                            });
                        }
                    }
                }
            }
            return accumulator
        }, {
            ranges: {},
            days: {},
            grouped: [],
        });

        return groupedObject.grouped;
    }
}

这产生了这个:

[
   {
      "days":"Monday-Friday",
      "open":"8:00 AM",
      "close":"5:00 PM"
   },
   {
      "days":"Wednesday",
      "open":"8:00 AM",
      "close":"6:00 PM"
   },
   {
      "days":"Saturday",
      "open":"8:00 AM",
      "close":"4:00 PM"
   }
]

我真的很接近但问题是如果一家商店在一个范围的中间有不同的时间它不会分开这些日子,即星期三开放到 6,但每隔一个工作日开放到 5。它会返回 MF 9 -5 和 W 9-6。所以在这种情况下,我想要这样:

[
   {
      "days":"Monday-Tuesday",
      "open":"8:00 AM",
      "close":"5:00 PM"
   },
   {
      "days":"Wednesday",
      "open":"8:00 AM",
      "close":"6:00 PM"
   },
   {
      "days":"Thursday-Friday",
      "open":"8:00 AM",
      "close":"5:00 PM"
   },
   {
      "days":"Saturday",
      "open":"8:00 AM",
      "close":"4:00 PM"
   }
]

标签: javascript

解决方案


您可以查看打开和关闭并添加一个新对象。否则更改 days 属性。

var data = [{ dayOfWeek: "Monday", open: "8:00 AM", close: "5:00 PM" }, { dayOfWeek: "Tuesday", open: "8:00 AM", close: "5:00 PM" }, { dayOfWeek: "Wednesday", open: "8:00 AM", close: "6:00 PM" }, { dayOfWeek: "Thursday", open: "8:00 AM", close: "5:00 PM" }, { dayOfWeek: "Friday", open: "8:00 AM", close: "5:00 PM" }, { dayOfWeek: "Saturday", open: "8:00 AM", close: "4:00 PM" }],
    result = data.reduce((r, { dayOfWeek, open, close }) => {
        if (!r.length || r[r.length - 1].open !== open || r[r.length - 1].close !== close)
            r.push({ days: dayOfWeek, open, close });
        else
            r[r.length - 1].days = r[r.length - 1].days.split('-').slice(0, 1).concat(dayOfWeek).join('-');                
        return r;
    }, []);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }


推荐阅读