根据不同的时间过滤时间

问题描述 投票:1回答:1

我想要一个通用的javascript函数,它应该接受一个对象数组.每个对象都有一个小时属性,这是一个数组,可以在下面的代码中看到.每个小时显示每天不同的时间.现在我需要过滤时间.如果从周一到周二的时间(从和到)是相同的,那么它应该显示:M-T:9-5PM W-T:9-9PM Sat-Sun:Closed如果从周一到周五的时间是相同的,并且在周六或周日不同,它应该显示M-F:9-5PM Sat:9-9PM and sun:closed。

我应该返回数组中的数据,这样我就可以在UI中以下面的格式显示,它应该返回包含这些数据的数组,这样就可以很容易地在前端使用循环来渲染。

例如:我把两个对象放在一个数组中,总的来说我希望只显示一次不同的时间。

javascript arrays object ecmascript-6 filter
1个回答
0
投票

像这样的吗?

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"
      }
    ]
  }
]
© www.soinside.com 2019 - 2024. All rights reserved.