javascript - 按星期几分组包含商店营业时间的对象
问题描述
我正在尝试按商店营业时间对天数进行分组。
这就是我的对象的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"
}
]
解决方案
您可以查看打开和关闭并添加一个新对象。否则更改 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; }
推荐阅读
- arduino - HC-05 模块发送数据问题(Mater + Slave)
- java - Spring Boot:EL 在 JSP 中不起作用
- command-line-interface - IBM Cloud:来自同一本地用户的多个 IBM Cloud CLI 环境(会话)
- c++ - 使用户能够在基于对话框的 MFC 应用程序上选择文件夹和文件
- javascript - 无法从对象获取特定属性而其他对象没有问题
- c++ - 使用 cin 不接受 C++ 输入
- java - java.library.path 中没有 pytorch_jni
- python - 从beeline配置pyhive
- arrays - 如何使用solidity在remix IDE中的数组中插入用户输入数据?
- c++ - 为什么会跳过 Switch 语句?