1

我正在使用一个 API,它以一种奇怪的格式向我吐出数据。或者至少对我来说是这样。数据是商店的营业时间,我想在前端以我需要的方式匹配它们(应用程序是用 Angular 编写的,使用两个 API,所以我需要让 API 与我的逻辑一起工作,我不想适应他们的格式)

这是来自 API 的数据格式:

var operatingHoursArray = [
    {Weds: true, End: "17:00", Start: "09:00"},
    {Tue: true, End: "17:00", Start: "09:00"},
    {Thur: true, End: "17:00", Start: "09:00"},
    {Sun: false, End: "", Start: ""},
    {Sat: true, End: "17:00", Start: "09:00"},
    {Mon: true, End: "17:00", Start: "09:00"},
    {Fri: true, End: "17:00", Start: "09:00"}
]

一个奇怪的结构 IMO,我更希望一周中的日子成为对象,然后隐藏在其中的开放和关闭时间。我的应用程序 (AngularJS) 要求数据采用以下格式:

var formattedHours = {
    Sunday: 'Closed',
    Monday: 'Closed',
    Tuesday: 'Closed',
    Wednesday: 'Closed',
    Thursday: 'Closed',
    Friday: 'Closed',
    Saturday: 'Closed'
};

时间默认为“关闭”,这是我用来将星期几与我需要的格式匹配的代码:

var daysOfWeek = [
    { sform: 'Mon', lform: 'Monday' },
    { sform: 'Tue', lform: 'Tuesday' },
    { sform: 'Weds', lform: 'Wednesday' },
    { sform: 'Thur', lform: 'Thursday' },
    { sform: 'Fri', lform: 'Friday' },
    { sform: 'Sat', lform: 'Saturday' },
    { sform: 'Sun', lform: 'Sunday' }
];

// Loop through the operating hours for the dealer
for (var i = operatingHoursArray.length - 1; i >= 0; i--) {
    // Loop through the property names for each day, getting the first property name (the day of week)
    for (property in operatingHoursArray[i]) {
        // Loop through the days of the week
        for (var v = daysOfWeek.length - 1; v >= 0; v--) {
            // If the day of the week (array) matches the property name, get the details
            if(daysOfWeek[v].sform == property && operatingHoursArray[i][property] === true) {
                formattedHours[daysOfWeek[v].lform] = operatingHoursArray[i].Start + ' - ' + operatingHoursArray[i].End;
            }
        };
        break; // Forces loop to stop after first property
    }
};

这很快就变得非常讨厌,但是以我的知识(菜鸟级别),我不确定如何使它更有效。它可以满足我的需要,但是有更好的编码方法吗?目前它必须运行 49 次才能检查一周中的每一天。同样,有些商店不提供 7 天的营业时间,而只提供营业时间。我无法更改 的结构,formattedHours因为其他 API 依赖于相同的结构。

4

3 回答 3

4

将 daysOfWeek 更改为一个对象:

var daysOfWeek = {
    Mon: "Monday",
    Tue: "Tuesday",
    ...
};

然后你可以只访问daysOfWeek[property]而不是daysOfWeek使用循环搜索。

于 2013-08-30T20:48:55.380 回答
2

从短到长的日期名称的散列开始。

var daysOfWeek = {
    'Mon': 'Monday',
    'Tue': 'Tuesday',
    'Weds': 'Wednesday',
    'Thur': 'Thursday',
    'Fri': 'Friday',
    'Sat': 'Saturday',
    'Sun': 'Sunday'
];

for (var i = operatingHoursArray.length - 1; i >= 0; i--) {
    // Loop through the property names for each day, getting the first property name (the day of week)
    for (property in operatingHoursArray[i]) {
        var dow = daysOfWeek[property];
        if(dow && operatingHoursArray[i][property]) {
            formattedHours[dow] = operatingHoursArray[i].Start + ' - ' + operatingHoursArray[i].End;
            break;
        }
    }
}
于 2013-08-30T20:52:08.597 回答
0

我会接受您订购的集合并对其进行迭代。对于每个项目,我会循环operatingHoursArray直到找到当前的一个daysOfWeek,然后构建你的字符串。

使用.forEach().every()稍微清理一下。.every()用于内部循环,以便我们可以在找到匹配项后停止迭代。

var daysOfWeek = [
    { sform: 'Mon', lform: 'Monday' },
    { sform: 'Tue', lform: 'Tuesday' },
    { sform: 'Weds', lform: 'Wednesday' },
    { sform: 'Thur', lform: 'Thursday' },
    { sform: 'Fri', lform: 'Friday' },
    { sform: 'Sat', lform: 'Saturday' },
    { sform: 'Sun', lform: 'Sunday' }
];

daysOfWeek.forEach(function(day) {
    operatingHoursArray.every(function(item) {
         if (item.hasOwnProperty(day.sform)) {
             day.formatted = item.Start + ' - ' + item.End;
             day.start = item.Start;
             day.end = item.End;
             day.open = item[day.sform]
             return false;
         }
    });
});

请注意,我正在将格式化字符串以及原始数据添加到您的daysOfWeek对象中。

这样您就可以保持您定义的顺序。因此,现在您可以按索引查找,并以可靠的顺序进行迭代,这在使用for-in.

于 2013-08-30T21:23:11.130 回答