我正在尝试编写一个javascript函数,以将几天与一家商店的营业时间相似的天合并在一起。例如,如果我们有:
“小时”: [
“星期五11:00 am-3:00 pm,5:00 pm-10:00 pm”,
“星期一11:00 am-3:00 pm,5:00 pm-9:30 pm”,
“星期六12:00 pm-10:00 pm”,
“星期日12:00 pm-9:30 pm”,
“星期四11:00 am-3:00 pm,5:00pm-9:30 pm”,
“星期二11:00 am-3:00 pm,5:00pm-9:30 pm”,
“星期三11:00 am-3:00 pm,5:00 pm-9:30 pm”
],
我希望代码将其简化为:
“小时”: [
“ Mo-Sa 11:00-14:30”,
“ Mo-Th 17:00-21:30”,
“ Fr-Sa 17:00-22:00”
],
没有很长的if/else
或case
语句列表,有没有办法做到这一点?
最佳答案
发挥功能,省去很多麻烦。
假设这是您的数据:
var data = [
{day: "Mon", open: 900, close: 1700},
{day: "Tue", open: 900, close: 1700},
{day: "Wed", open: 700, close: 1700},
{day: "Thu", open: 900, close: 1700},
{day: "Fri", open: 900, close: 1700},
{day: "Sat", open: 900, close: 1900},
{day: "Sun", open: 900, close: 1900},
];
您只需在6行代码中将数组
reduce
简化为合并的数组即可:var merged = data.reduce(function(preVal, curVal) {
var last = preVal[preVal.length - 1];
if (last && last.open == curVal.open && last.close == curVal.close) {
last.endDay = curVal.day;
} else {
preVal.push(curVal);
}
return preVal;
}, []);
并且以防万一调试:
for (var i in merged) {
var m = merged[i];
var endDay = m.endDay ? " to " + m.endDay : "";
console.log(m.day + endDay + " " + m.open + "-" + m.close);
}
奖励现在,如果您必须将
merged
转换为其他格式(例如,需要在屏幕上打印的内容),则可以再次使用功能,并将map
合并为所需的任何格式:var mergedNewFormat = merged.map(function(v) {
return {
days: [v.day, v.endDay ? v.endDay : v.day],
hours: [v.open, v.close],
};
});
关于javascript - 如何合并营业时间相似的日子,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30361551/