2017-08-15 82 views
2

我有一個星期天的名稱作爲鍵的對象,其值是一個對象數組,其中包含有關不同班次中的開始和結束時間的信息。爲什麼我在以下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' }, 
     { 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分鐘。

enter image description here

雖然我在建築名單並取得成功,我無法弄清楚,爲什麼我得到了確切的日子相同的值。我在某處錯過了一些簡單的東西。

enter image description here

這裏是我的代碼。

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; 
} 
+0

初始化'Object1'到'{}'作爲'爲(讓關鍵的第一條語句...'循環。 –

+0

另外,考慮使用日期時庫(如Date.js)將所有分割/三元操作減少爲幾個簡單的分析和toStrings。 – Extragorey

+0

好的信息,謝謝。 – anonym

回答

0

對象通過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' 
 
    }, 
 
    { 
 
     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' 
 
    } 
 
    ], 
 
}; 
 

 
let Object2 = {}; 
 

 
for (let key in openingTimes) { 
 

 
    let Object1 = {}; 
 

 
    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; 
 
}

+0

謝謝,這很好。 – anonym

1

我參加了一個功能更強大的方法。

當你有一個數據列表,你需要轉換到另一個數據列表,我認爲map,filterreduce是要走的路。

This is a decent video that explains the idea

希望這會很有意思。

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' 
 
    } 
 
    ], 
 
}; 
 

 
const fifteenMinutes = new Date('1970-01-01 00:15:00') - new Date('1970-01-01 00:00:00'); 
 

 
// notice the single assignment and no for-loops 
 
const transformedOpeningTimes = (Object 
 
    // grab the keys 
 
    .keys(openingTimes) 
 
    // map to tuples of key values 
 
    .map(dayOfTheWeek => ({ 
 
    dayOfTheWeek, 
 
    times: openingTimes[dayOfTheWeek] 
 
    })) 
 
    // map the values to `shifts` 
 
    .map(({ 
 
    dayOfTheWeek, 
 
    times 
 
    }) => ({ 
 
    dayOfTheWeek, 
 
    // for each time, reduce into the `shifts` object 
 
    shifts: times.reduce((shifts, time) => { 
 
     const { 
 
     opening_time, 
 
     closing_time, 
 
     shift 
 
     } = time; 
 
     const lower = new Date(`1970-01-01 ${opening_time}`).getTime(); 
 
     const upper = new Date(`1970-01-01 ${closing_time}`).getTime(); 
 
     // calculate how many interval we need 
 
     const intervals = parseInt((upper - lower)/fifteenMinutes); 
 
     shifts[shift] = (Array(intervals) 
 
     // create an array with the same length of intervals 
 
     .fill(0) 
 
     // map them to dates 
 
     .map((_, index) => new Date(index * fifteenMinutes + lower)) 
 
     // map the dates to time strings 
 
     .map(date => date.toTimeString()) 
 
     // convert the time strings to other time strings 
 
     .map(dateString => { 
 
      const hours = parseInt(dateString.slice(0, 2)); 
 
      const amOrPm = hours > 12 ? 'AM' : 'PM'; 
 
      return `${hours % 12}:${dateString.slice(3, 5)} ${amOrPm}`; 
 
     }) 
 
    ); 
 
     return shifts; 
 
    }, {}) 
 
    })) 
 
    // reduce back into the object 
 
    .reduce((transformedOpeningTimes, { 
 
    dayOfTheWeek, 
 
    shifts 
 
    }) => { 
 
    transformedOpeningTimes[dayOfTheWeek] = shifts; 
 
    return transformedOpeningTimes; 
 
    }, {}) 
 
); 
 

 
console.log(transformedOpeningTimes);

+0

這似乎是一個好主意。 – anonym

相關問題