我想要一个通用的javascript函数,它应该接受一个对象数组.每个对象都有一个小时属性,这是一个数组,可以在下面的代码中看到.每个小时显示每天不同的时间.现在我需要过滤时间.如果从周一到周二的时间(从和到)是相同的,那么它应该显示:M-T:9-5PM W-T:9-9PM Sat-Sun:Closed如果从周一到周五的时间是相同的,并且在周六或周日不同,它应该显示M-F:9-5PM Sat:9-9PM and sun:closed。
我应该返回数组中的数据,这样我就可以在UI中以下面的格式显示,它应该返回包含这些数据的数组,这样就可以很容易地在前端使用循环来渲染。
例如:我把两个对象放在一个数组中,总的来说我希望只显示一次不同的时间。
像这样的吗?
const myHours = myData.map(item => {
const aggHours = item.hours.reduce((aggArr, obj) => {
const len = aggArr.length;
const last = len - 1;
//console.log(len, obj, aggArr)
if (len == 0){
aggArr.push({...obj, dayStr: obj.day});
}
else if (aggArr[last].fromHour == obj.fromHour
&& aggArr[last].toHour == obj.toHour) {
aggArr[last].dayStr = aggArr[last].day + " - " + obj.day;
}
else {
aggArr.push({...obj, dayStr: obj.day});
}
return aggArr;
}, []);
return {id: item.id, aggHours: aggHours.map(elem => {
if (elem.closed){
return {day: elem.dayStr, time: 'closed'};
}
else {
return {day: elem.dayStr, time: elem.fromHour + ' - ' + elem.toHour};
}
})};
});
console.log(myHours);
<script id="loadData">
const myData = [
{
"phones":[
{
"id":"dealer/phones/phone_0?sales=department",
"dialIn":"8777931407",
"region":"+1",
"areaCode":"877",
"carrier":"793",
"subscriber":"1407",
"nodeUri":{
"query":"sales=department",
"params":{
"sales":"department"
},
"domainName":"dealer",
"modelName":"phones",
"instanceID":"phone_0"
}
}
],
"address":{
"street1":"2101 Pennsylvania Ave",
"street2":null,
"city":"Wilmington",
"state":"DE",
"country":"US",
"postalCode":"19806",
"latitude":39.7578416,
"longitude":-75.5688727,
"timeZone":"America/New_York",
"region":"NORTHEAST",
"county":"NEW CASTLE"
},
"id":"dealer/department/sales",
"displayName":"Sales By Appointment",
"name":"sales",
"email":"[email protected]",
"phoneNumber":"8777931407",
"hours":[
{
"fromHour":"09:00",
"toHour":"17:00",
"day":"Monday"
},
{
"fromHour":"09:00",
"toHour":"17:00",
"day":"Tuesday"
},
{
"fromHour":"09:00",
"toHour":"17:00",
"day":"Wednesday"
},
{
"fromHour":"09:00",
"toHour":"17:00",
"day":"Thursday"
},
{
"fromHour":"09:00",
"toHour":"17:00",
"day":"Friday"
},
{
"fromHour":"09:00",
"toHour":"17:00",
"day":"Saturday"
},
{
"closed":true,
"fromHour":"Closed",
"toHour":"Closed",
"day":"Sunday"
}
],
"hoursOfOperationTitle":"Hours Of Operation",
"nodeUri":{
"query":"",
"domainName":"dealer",
"modelName":"department",
"instanceID":"sales"
}
}
,
{
"phones":[
{
"id":"dealer/phones/phone_0?service=department",
"dialIn":"3024828359",
"region":"+1",
"areaCode":"302",
"carrier":"482",
"subscriber":"8359",
"nodeUri":{
"query":"service=department",
"params":{
"service":"department"
},
"domainName":"dealer",
"modelName":"phones",
"instanceID":"phone_0"
}
}
],
"address":{
"street1":"2101 Pennsylvania Ave",
"street2":null,
"city":"Wilmington",
"state":"DE",
"country":"US",
"postalCode":"19806",
"latitude":39.7578416,
"longitude":-75.5688727,
"timeZone":"America/New_York",
"region":"NORTHEAST",
"county":"NEW CASTLE"
},
"dynamicAttr":{
"itemprop":"department",
"itemtype":"//schema.org/AutoRepair"
},
"displayNameAttr":{
"itemprop":"name"
},
"id":"dealer/department/service",
"displayName":"Service ",
"name":"service",
"email":"[email protected]",
"phoneNumber":"3024828359",
"hours":[
{
"fromHour":"07:00",
"toHour":"16:00",
"day":"Monday"
},
{
"fromHour":"07:00",
"toHour":"16:00",
"day":"Tuesday"
},
{
"fromHour":"07:00",
"toHour":"16:00",
"day":"Wednesday"
},
{
"fromHour":"07:00",
"toHour":"16:00",
"day":"Thursday"
},
{
"fromHour":"07:00",
"toHour":"16:00",
"day":"Friday"
},
{
"fromHour":"07:00",
"toHour":"16:00",
"day":"Saturday"
},
{
"closed":true,
"fromHour":"Closed",
"toHour":"Closed",
"day":"Sunday"
}
],
"nodeUri":{
"query":"",
"domainName":"dealer",
"modelName":"department",
"instanceID":"service"
}
}
]
</script>
输出。
[
{
"id": "dealer/department/sales",
"aggHours": [
{
"day": "Monday - Saturday",
"time": "09:00 - 17:00"
},
{
"day": "Sunday",
"time": "closed"
}
]
},
{
"id": "dealer/department/service",
"aggHours": [
{
"day": "Monday - Saturday",
"time": "07:00 - 16:00"
},
{
"day": "Sunday",
"time": "closed"
}
]
}
]
第二个例子。
const myHours = myData.map(item => {
const aggHours = item.hours.reduce((aggArr, obj) => {
const len = aggArr.length;
const last = len - 1;
//console.log(len, obj, aggArr)
if (len == 0){
aggArr.push({...obj, dayStr: obj.day});
}
else if (aggArr[last].fromHour == obj.fromHour
&& aggArr[last].toHour == obj.toHour) {
aggArr[last].dayStr = aggArr[last].day + " - " + obj.day;
}
else {
aggArr.push({...obj, dayStr: obj.day});
}
return aggArr;
}, []);
return {id: item.id, aggHours: aggHours.map(elem => {
if (elem.closed){
return {day: elem.dayStr, time: 'closed'};
}
else {
return {day: elem.dayStr, time: elem.fromHour + ' - ' + elem.toHour};
}
})};
});
console.log(myHours);
<script id="loadData">
const myData = [
{
"phones":[
{
"id":"dealer/phones/phone_0?sales=department",
"dialIn":"8777931407",
"region":"+1",
"areaCode":"877",
"carrier":"793",
"subscriber":"1407",
"nodeUri":{
"query":"sales=department",
"params":{
"sales":"department"
},
"domainName":"dealer",
"modelName":"phones",
"instanceID":"phone_0"
}
}
],
"address":{
"street1":"2101 Pennsylvania Ave",
"street2":null,
"city":"Wilmington",
"state":"DE",
"country":"US",
"postalCode":"19806",
"latitude":39.7578416,
"longitude":-75.5688727,
"timeZone":"America/New_York",
"region":"NORTHEAST",
"county":"NEW CASTLE"
},
"id":"dealer/department/sales",
"displayName":"Sales By Appointment",
"name":"sales",
"email":"[email protected]",
"phoneNumber":"8777931407",
"hours":[
{
"fromHour":"09:00",
"toHour":"17:00",
"day":"Monday"
},
{
"fromHour":"09:00",
"toHour":"17:00",
"day":"Tuesday"
},
{
"fromHour":"09:00",
"toHour":"17:00",
"day":"Wednesday"
},
{
"fromHour":"09:00",
"toHour":"17:00",
"day":"Thursday"
},
{
"fromHour":"09:00",
"toHour":"17:00",
"day":"Friday"
},
{
"closed":true,
"fromHour":"Closed",
"toHour":"Closed",
"day":"Saturday"
},
{
"closed":true,
"fromHour":"Closed",
"toHour":"Closed",
"day":"Sunday"
}
],
"hoursOfOperationTitle":"Hours Of Operation",
"nodeUri":{
"query":"",
"domainName":"dealer",
"modelName":"department",
"instanceID":"sales"
}
}
,
{
"phones":[
{
"id":"dealer/phones/phone_0?service=department",
"dialIn":"3024828359",
"region":"+1",
"areaCode":"302",
"carrier":"482",
"subscriber":"8359",
"nodeUri":{
"query":"service=department",
"params":{
"service":"department"
},
"domainName":"dealer",
"modelName":"phones",
"instanceID":"phone_0"
}
}
],
"address":{
"street1":"2101 Pennsylvania Ave",
"street2":null,
"city":"Wilmington",
"state":"DE",
"country":"US",
"postalCode":"19806",
"latitude":39.7578416,
"longitude":-75.5688727,
"timeZone":"America/New_York",
"region":"NORTHEAST",
"county":"NEW CASTLE"
},
"dynamicAttr":{
"itemprop":"department",
"itemtype":"//schema.org/AutoRepair"
},
"displayNameAttr":{
"itemprop":"name"
},
"id":"dealer/department/service",
"displayName":"Service ",
"name":"service",
"email":"[email protected]",
"phoneNumber":"3024828359",
"hours":[
{
"fromHour":"07:00",
"toHour":"16:00",
"day":"Monday"
},
{
"fromHour":"07:00",
"toHour":"16:00",
"day":"Tuesday"
},
{
"fromHour":"07:00",
"toHour":"16:00",
"day":"Wednesday"
},
{
"fromHour":"07:00",
"toHour":"16:00",
"day":"Thursday"
},
{
"fromHour":"07:00",
"toHour":"11:00",
"day":"Friday"
},
{
"fromHour":"07:00",
"toHour":"11:00",
"day":"Saturday"
},
{
"fromHour":"07:00",
"toHour":"11:00",
"day":"Sunday"
}
],
"nodeUri":{
"query":"",
"domainName":"dealer",
"modelName":"department",
"instanceID":"service"
}
}
]
</script>
输出:
[
{
"id": "dealer/department/sales",
"aggHours": [
{
"day": "Monday - Friday",
"time": "09:00 - 17:00"
},
{
"day": "Saturday - Sunday",
"time": "closed"
}
]
},
{
"id": "dealer/department/service",
"aggHours": [
{
"day": "Monday - Thursday",
"time": "07:00 - 16:00"
},
{
"day": "Friday - Sunday",
"time": "07:00 - 11:00"
}
]
}
]
第三个例子:
const myHours = myData.map(item => {
const aggHours = item.hours.reduce((aggObj, obj) => {
const times = obj.fromHour + ' - ' + obj.toHour;
if (aggObj[times]){
aggObj[times].days.push(obj.day);
}
else {
aggObj[times] = {...obj, days: [obj.day]};
}
return aggObj;
}, {});
return {id: item.id, aggHours: Object.values(aggHours).map(elem => {
if (elem.closed){
return {day: elem.days, time: 'closed'};
}
else {
return {day: elem.days, time: elem.fromHour + ' - ' + elem.toHour};
}
})};
});
console.log(myHours);
<script id="loadData">
const myData = [
{
"phones":[
{
"id":"dealer/phones/phone_0?sales=department",
"dialIn":"8777931407",
"region":"+1",
"areaCode":"877",
"carrier":"793",
"subscriber":"1407",
"nodeUri":{
"query":"sales=department",
"params":{
"sales":"department"
},
"domainName":"dealer",
"modelName":"phones",
"instanceID":"phone_0"
}
}
],
"address":{
"street1":"2101 Pennsylvania Ave",
"street2":null,
"city":"Wilmington",
"state":"DE",
"country":"US",
"postalCode":"19806",
"latitude":39.7578416,
"longitude":-75.5688727,
"timeZone":"America/New_York",
"region":"NORTHEAST",
"county":"NEW CASTLE"
},
"id":"dealer/department/sales",
"displayName":"Sales By Appointment",
"name":"sales",
"email":"[email protected]",
"phoneNumber":"8777931407",
"hours":[
{
"fromHour":"09:00",
"toHour":"17:00",
"day":"Monday"
},
{
"fromHour":"09:00",
"toHour":"17:00",
"day":"Tuesday"
},
{
"fromHour":"09:00",
"toHour":"17:00",
"day":"Wednesday"
},
{
"fromHour":"09:00",
"toHour":"17:00",
"day":"Thursday"
},
{
"fromHour":"09:00",
"toHour":"17:00",
"day":"Friday"
},
{
"closed":true,
"fromHour":"Closed",
"toHour":"Closed",
"day":"Saturday"
},
{
"fromHour":"09:00",
"toHour":"17:00",
"day":"Sunday"
}
],
"hoursOfOperationTitle":"Hours Of Operation",
"nodeUri":{
"query":"",
"domainName":"dealer",
"modelName":"department",
"instanceID":"sales"
}
}
,
{
"phones":[
{
"id":"dealer/phones/phone_0?service=department",
"dialIn":"3024828359",
"region":"+1",
"areaCode":"302",
"carrier":"482",
"subscriber":"8359",
"nodeUri":{
"query":"service=department",
"params":{
"service":"department"
},
"domainName":"dealer",
"modelName":"phones",
"instanceID":"phone_0"
}
}
],
"address":{
"street1":"2101 Pennsylvania Ave",
"street2":null,
"city":"Wilmington",
"state":"DE",
"country":"US",
"postalCode":"19806",
"latitude":39.7578416,
"longitude":-75.5688727,
"timeZone":"America/New_York",
"region":"NORTHEAST",
"county":"NEW CASTLE"
},
"dynamicAttr":{
"itemprop":"department",
"itemtype":"//schema.org/AutoRepair"
},
"displayNameAttr":{
"itemprop":"name"
},
"id":"dealer/department/service",
"displayName":"Service ",
"name":"service",
"email":"[email protected]",
"phoneNumber":"3024828359",
"hours":[
{
"fromHour":"07:00",
"toHour":"16:00",
"day":"Monday"
},
{
"fromHour":"07:00",
"toHour":"16:00",
"day":"Tuesday"
},
{
"fromHour":"07:00",
"toHour":"16:00",
"day":"Wednesday"
},
{
"fromHour":"07:00",
"toHour":"16:00",
"day":"Thursday"
},
{
"fromHour":"07:00",
"toHour":"11:00",
"day":"Friday"
},
{
"fromHour":"07:00",
"toHour":"11:00",
"day":"Saturday"
},
{
"fromHour":"07:00",
"toHour":"11:00",
"day":"Sunday"
}
],
"nodeUri":{
"query":"",
"domainName":"dealer",
"modelName":"department",
"instanceID":"service"
}
}
]
</script>
输出
[
{
"id": "dealer/department/sales",
"aggHours": [
{
"day": [
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Sunday"
],
"time": "09:00 - 17:00"
},
{
"day": [
"Saturday"
],
"time": "closed"
}
]
},
{
"id": "dealer/department/service",
"aggHours": [
{
"day": [
"Monday",
"Tuesday",
"Wednesday",
"Thursday"
],
"time": "07:00 - 16:00"
},
{
"day": [
"Friday",
"Saturday",
"Sunday"
],
"time": "07:00 - 11:00"
}
]
}
]