JavaScript:在循环中优化循环
我正在使用一个API,它以一种奇怪的格式向我吐回数据。或者至少对我来说是这样。数据是一个存储的运行时间,我想在前端以我需要的方式匹配它们。应用程序是用Angular编写的,使用两个API,所以我需要让API与我的逻辑一起工作,我不想适应它们的格式 这是来自API的数据格式:JavaScript:在循环中优化循环,javascript,performance,Javascript,Performance,我正在使用一个API,它以一种奇怪的格式向我吐回数据。或者至少对我来说是这样。数据是一个存储的运行时间,我想在前端以我需要的方式匹配它们。应用程序是用Angular编写的,使用两个API,所以我需要让API与我的逻辑一起工作,我不想适应它们的格式 这是来自API的数据格式: var operatingHoursArray = [ {Weds: true, End: "17:00", Start: "09:00"}, {Tue: true, End: "17:00", Start:
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"}
]
在我看来,这是一个奇怪的结构,我更喜欢把一周中的几天当作物体,然后把开放和关闭的时间藏在里面。
我的应用程序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依赖于该结构。将daysOfWeek更改为对象:
var daysOfWeek = {
Mon: "Monday",
Tue: "Tuesday",
...
};
然后,您可以访问daysOfWeek[属性],而不是使用循环搜索daysOfWeek。将daysOfWeek更改为对象:
var daysOfWeek = {
Mon: "Monday",
Tue: "Tuesday",
...
};
然后,您可以访问daysOfWeek[属性],而不是使用循环搜索daysOfWeek。从短到长日期名称的散列开始
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;
}
}
}
从短到长的日期名称开始
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;
}
}
}
我会接受你的有序集合并迭代它。对于每个项,我将循环操作hoursarray,直到找到当前daysOfWeek的一个,然后构建字符串 使用.forEach和.each可以稍微清理一下。.each用于内部循环,以便在找到匹配项后停止迭代
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时是不可能的。我将使用您的有序集合并进行迭代。对于每个项,我将循环操作hoursarray,直到找到当前daysOfWeek的一个,然后构建字符串 使用.forEach和.each可以稍微清理一下。.each用于内部循环,以便在找到匹配项后停止迭代
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时是不可能的。如果您打开的最终对象的名称较短而不是较长,则可能会快得多//强制循环在第一个属性之后停止,因为没有第一个属性。在使用for-in.Ooo时,您不能依赖于迭代的顺序,我不知道这一点,谢谢您的提醒。如果它们不按顺序排列,那真的会把事情搞砸:是的,更糟糕的是,它可能会给你第一个,但无论如何,它可能会给你一个不同的财产。如果需要任何类型的保证顺序,则必须使用数组。这两个答案告诉您改为使用对象,将失去daysOfWeek数组提供的顺序。如果您打开最后一个对象的短名称而不是长名称,则可能会快得多//强制循环在第一个属性之后停止,因为没有第一个属性。在使用for-in.Ooo时,您不能依赖于迭代的顺序,我不知道这一点,谢谢您的提醒。如果它们不按顺序排列,那真的会把事情搞砸:是的,更糟糕的是,它可能会给你第一个,但无论如何,它可能会给你一个不同的财产。如果需要任何类型的保证顺序,则必须使用数组。这两个答案告诉您改为使用对象,将失去daysOfWeek数组提供的顺序。