为什么在下面的JavaScript操作中会得到重复的值?

为什么在下面的JavaScript操作中会得到重复的值?,javascript,Javascript,我有一个对象,其名称为一周中的几天,作为键,其值是一个对象数组,其中包含关于不同班次中打开和关闭时间的信息 let openingTimes = { sunday: [ { id: 1, shift: 'morning', opening_time: '07:00', closing_time: '11:00' }, { id: 1, shift: 'day', opening_time: '13:30', closing_time: '16:30

我有一个对象,其名称为一周中的几天,作为键,其值是一个对象数组,其中包含关于不同班次中打开和关闭时间的信息

let openingTimes = 
{
    sunday: [
        { id: 1, shift: 'morning', opening_time: '07:00', closing_time: '11:00' },
        { id: 1, shift: 'day',    opening_time: '13:30', closing_time: '16:30' },
        { id: 1, shift: 'night', opening_time: '20:00', closing_time: '23:00' }
    ],
    monday: [
        { id: 1, shift: 'day',    opening_time: '13:30', closing_time: '16:30' }
    ],
    wednesday: [
        { id: 1, shift: 'morning', opening_time: '07:00', closing_time: '12:00' },
        { id: 1, shift: 'night', opening_time: '20:00', closing_time: '23:00' }
    ],
    thursday: [
        { id: 1, shift: 'morning', opening_time: '07:00', closing_time: '12:00' },
        { id: 1, shift: 'night', opening_time: '20:00', closing_time: '23:00' }
    ],
    friday: [
        { id: 1, shift: 'day',    opening_time: '13:30', closing_time: '16:30' },
        { id: 1, shift: 'night', opening_time: '20:00', closing_time: '23:00' }
    ],
};
我正在尝试对JSON数据进行一个小的更改。对于天数名称的值,我尝试添加对象,其键是班次,值是从开始时间到结束时间的时间数组,两者之间相差15分钟

虽然我成功地建立了这个列表,但我无法理解为什么我每天都得到完全相同的值。我错过了一些简单的东西

这是我的密码

let Object1 = {};
let Object2 = {};

for (let key in openingTimes)
{
    openingTimes[key].forEach(item =>
    {
         /* Separate opening time to parts by colon */
        let oParts = item.opening_time.split(':');
        let oHour = oParts[0];
        let oMins = oParts[1];

        /* Separate closing time to parts by colon */
        let cParts = item.closing_time.split(':');
        let cHour = cParts[0];
        let cMins = cParts[1];

        Object1[item.shift] = buildTimeArray(oHour, oMins, cHour, cMins, 15);

        Object2[key] = Object1;
    });
}

console.log(Object2);

/**
 * Gather restaurant hours and return the array of available delivery times in difference of specified minutes
 * @params  Opening Hour, Opening Minutes, Closing Hour, Closing Minutes, Miutes Interval
 */
function buildTimeArray(oHour, oMins, cHour, cMins, interval_mins)
{
    let result = [];
    let start = new Date('','','',oHour, oMins);
    let end = new Date('','','',cHour, cMins);
    for (let d = start; d <= end; d.setMinutes(d.getMinutes() + interval_mins))
    {
        result.push(this.meridianTime(d));
    }
    return result;
}

/**
 * Build time in 12 hrs AM/PM format
 */
function meridianTime(inputDate)
{
    let hours = inputDate.getHours();
    let minutes = inputDate.getMinutes();
    let ampm = hours < 12 ? "AM" : (hours = hours % 12, "PM");

    hours =  hours === 0 ? 12 : hours < 10? ("0" + hours) : hours;
    minutes = minutes < 10 ? ("0" + minutes) : minutes;
    return hours + ":" + minutes + " " + ampm;
}
let Object1={};
让Object2={};
for(输入打开时间)
{
openingTimes[key].forEach(项=>
{
/*用冒号将打开时间分隔为各个部分*/
让opart=item.opening_time.split(“:”);
设oHour=opart[0];
设oMins=opart[1];
/*用冒号分隔零件的关闭时间*/
让cpart=item.closing_time.split(“:”);
设cHour=cpart[0];
设cMins=cpart[1];
Object1[item.shift]=buildTimeArray(oHour、oMins、cHour、cMins、15);
Object2[key]=Object1;
});
}
console.log(Object2);
/**
*收集餐厅小时数并返回指定分钟差的可用配送时间数组
*@params开放时间、开放分钟、关闭小时、关闭分钟、分钟间隔
*/
函数构建时间数组(oHour、oMins、cHour、cMins、interval_mins)
{
让结果=[];
开始=新日期(“”,“”,“”,oHour,oMins);
let end=新日期(“”,“”,cHour,cMins);

for(让d=start;d对象在JavaScript中通过引用传递,因此每次都有效地添加相同的对象

让openingtime={
星期日:[{
id:1,
轮班:“早上好”,
开幕时间:“07:00”,
截止时间:“11:00”
},
{
id:1,
轮班:'天',
开幕时间:“13:30”,
截止时间:“16:30”
},
{
id:1,
轮班:“晚上”,
开幕时间:“20:00”,
截止时间:“23:00”
}
],
星期一:[{
id:1,
轮班:'天',
开幕时间:“13:30”,
截止时间:“16:30”
}],
星期三:[{
id:1,
轮班:“早上好”,
开幕时间:“07:00”,
截止时间:“12:00”
},
{
id:1,
轮班:“晚上”,
开幕时间:“20:00”,
截止时间:“23:00”
}
],
星期四:[{
id:1,
轮班:“早上好”,
开幕时间:“07:00”,
截止时间:“12:00”
},
{
id:1,
轮班:“晚上”,
开幕时间:“20:00”,
截止时间:“23:00”
}
],
星期五:[{
id:1,
轮班:'天',
开幕时间:“13:30”,
截止时间:“16:30”
},
{
id:1,
轮班:“晚上”,
开幕时间:“20:00”,
截止时间:“23:00”
}
],
};
让Object2={};
for(输入打开时间){
让Object1={};
openingTimes[key].forEach(项=>{
/*用冒号将打开时间分隔为各个部分*/
让opart=item.opening_time.split(“:”);
设oHour=opart[0];
设oMins=opart[1];
/*用冒号分隔零件的关闭时间*/
让cpart=item.closing_time.split(“:”);
设cHour=cpart[0];
设cMins=cpart[1];
Object1[item.shift]=buildTimeArray(oHour、oMins、cHour、cMins、15);
Object2[key]=Object1;
});
}
console.log(Object2);
/**
*收集餐厅小时数并返回指定分钟差的可用配送时间数组
*@params开放时间、开放分钟、关闭小时、关闭分钟、分钟间隔
*/
函数构建时间数组(oHour、oMins、cHour、cMins、interval_mins){
让结果=[];
开始=新日期(“”,“”,“”,oHour,oMins);
let end=新日期(“”,“”,cHour,cMins);

对于(让d=start;d我采用了更实用的方法

当您有一个需要转换为另一个数据列表的数据列表时,我认为,
map
filter
reduce
是最好的选择

希望这很有趣

让openingtime={
星期日:[{
id:1,
轮班:“早上好”,
开幕时间:“07:00”,
截止时间:“11:00”
},
{
id:1,
轮班:'天',
开幕时间:“13:30”,
截止时间:“16:30”
},
{
id:1,
轮班:“晚上”,
开幕时间:“20:00”,
截止时间:“23:00”
}
],
星期一:[{
id:1,
轮班:'天',
开幕时间:“13:30”,
截止时间:“16:30”
}],
星期三:[{
id:1,
轮班:“早上好”,
开幕时间:“07:00”,
截止时间:“12:00”
},
{
id:1,
轮班:“晚上”,
开幕时间:“20:00”,
截止时间:“23:00”
}
],
星期四:[{
id:1,
轮班:“早上好”,
开幕时间:“07:00”,
截止时间:“12:00”
},
{
id:1,
轮班:“晚上”,
开幕时间:“20:00”,
截止时间:“23:00”
}
],
星期五:[{
id:1,
轮班:'天',
开幕时间:“13:30”,
截止时间:“16:30”
},
{
id:1,
轮班:“晚上”,
开幕时间:“20:00”,
截止时间:“23:00”
}
],
};
常数五分钟=新日期('1970-01-01 00:15:00')-新日期('1970-01-01 00:00:00');
//请注意单个赋值和no for循环
const transformedOpenTimes=(对象
//抓住钥匙
.键(打开时间)
//映射到键值的元组
.map(星期五=>({
星期一,
时代:开放时代[星期一]
}))
//将值映射到`移位`
.地图(({
星期一,
时代
}) => ({
星期一,
//对于每一次,减少到'shifts'对象中
班次:次数。减少((班次,时间)=>{
常数{
开放时间,
关门时间,
转移
}=时间;
常数下限=新日期(`1970-0