2016-11-29 68 views
1

我是JavaScript新手。我們有一個代碼可以根據「員工ID」添加總小時數。下面的代碼顯示「excessTime」的正確結果。但對於「全部時間」,它顯示「NaN」。有誰知道爲什麼它會顯示「NaN」,同時添加「totalHours」以及如何修復它?無法計算總小時

<!DOCTYPE html> 
<html> 
<body> 
<script> 
var input = [ 
    { 
     "employeeId": "101", 
     "totalHours": "1:46", 
     "excessTime": "2:15" 
    }, 
    { 
     "employeeId": "102", 
     "totalHours": "1:15", 
     "excessTime": "1:30" 
    }, 
    { 
     "employeeId": "101", 
     "totalHours": "1:15", 
     "excessTime": "3:00" 
    }, 
    { 
     "employeeId": "102", 
     "totalHours": "1:00", 
     "excessTime": "2:15" 
    } 
] 

    var obj = input.reduce(function(init, e){ 
    if (init[e["employeeId"]] == undefined){ 
     init[e["employeeId"]] = {hours: parseInt(e["totalHours"].split(":")[0]),minutes: parseInt(e["totalHours"].split(":")[1])}; 
     init[e["employeeId"]].timeString = e["totalHours"]; 
     init[e["employeeId"]] = {hrs: parseInt(e["excessTime"].split(":")[0]),mns: parseInt(e["excessTime"].split(":")[1])}; 
     init[e["employeeId"]].excessString = e["excessTime"]; 
     return init; 
     } else { 
     init[e["employeeId"]].hours += (parseInt(e["totalHours"].split(":")[0]) + Math.floor((init[e["employeeId"]].minutes + parseInt(e["totalHours"].split(":")[1]))/60)); 
     init[e["employeeId"]].minutes = (init[e["employeeId"]].minutes + parseInt(e["totalHours"].split(":")[1]))%60; 
     init[e["employeeId"]].timeString = init[e["employeeId"]].minutes > 9 ? init[e["employeeId"]].hours + ":" + init[e["employeeId"]].minutes : init[e["employeeId"]].hours + ":0" + init[e["employeeId"]].minutes; 

     init[e["employeeId"]].hrs += (parseInt(e["excessTime"].split(":")[0]) + Math.floor((init[e["employeeId"]].mns + parseInt(e["excessTime"].split(":")[1]))/60)); 
     init[e["employeeId"]].mns = (init[e["employeeId"]].mns + parseInt(e["excessTime"].split(":")[1]))%60; 
     init[e["employeeId"]].excessString = init[e["employeeId"]].mns > 9 ? init[e["employeeId"]].hrs + ":" + init[e["employeeId"]].mns : init[e["employeeId"]].hrs + ":0" + init[e["employeeId"]].mns; 
     return init; 
     } 
    }, {}); 

var arr = []; 
for (var prop in obj) arr.push({employeeId: prop, totalHours: obj[prop].timeString, excessTime: obj[prop].excessString}); 
console.log(arr); 
</script> 
</body> 
</html> 

輸出:

[ 
    { 
     "employeeId": "101", 
     "totalHours": "NaN:0NaN", 
     "excessTime": "5:15" 
    }, 
    { 
     "employeeId": "102", 
     "totalHours": "NaN:0NaN", 
     "excessTime": "3:45" 
    } 
] 

回答

2

您正試圖分配值hoursminutes性質,但他們undefined。你需要將它們在你的第一個if聲明分別分配給他們的小時和分鐘:

init[e["employeeId"]].hours = parseInt(e["totalHours"].split(":")[0]); 
init[e["employeeId"]].minutes = parseInt(e["totalHours"].split(":")[1]); 

總之看起來是這樣的:

var input = [ 
    { 
     "employeeId": "101", 
     "totalHours": "1:46", 
     "excessTime": "2:15" 
    }, 
    { 
     "employeeId": "102", 
     "totalHours": "1:15", 
     "excessTime": "1:30" 
    }, 
    { 
     "employeeId": "101", 
     "totalHours": "1:15", 
     "excessTime": "3:00" 
    }, 
    { 
     "employeeId": "102", 
     "totalHours": "1:00", 
     "excessTime": "2:15" 
    } 
] 

    var obj = input.reduce(function(init, e){ 
    if (init[e["employeeId"]] == undefined){ 
     init[e["employeeId"]] = {hours: parseInt(e["totalHours"].split(":")[0]),minutes: parseInt(e["totalHours"].split(":")[1])}; 
     init[e["employeeId"]].timeString = e["totalHours"]; 
     init[e["employeeId"]] = {hrs: parseInt(e["excessTime"].split(":")[0]),mns: parseInt(e["excessTime"].split(":")[1])}; 
     init[e["employeeId"]].excessString = e["excessTime"]; 
     init[e["employeeId"]].hours = parseInt(e["totalHours"].split(":")[0]); 
     init[e["employeeId"]].minutes = parseInt(e["totalHours"].split(":")[1]); 
     return init; 
     } else { 
     init[e["employeeId"]].hours += (parseInt(e["totalHours"].split(":")[0]) + Math.floor((init[e["employeeId"]].minutes + parseInt(e["totalHours"].split(":")[1]))/60)); 
     init[e["employeeId"]].minutes = (init[e["employeeId"]].minutes + parseInt(e["totalHours"].split(":")[1]))%60; 
     init[e["employeeId"]].timeString = init[e["employeeId"]].minutes > 9 ? init[e["employeeId"]].hours + ":" + init[e["employeeId"]].minutes : init[e["employeeId"]].hours + ":0" + init[e["employeeId"]].minutes; 

     init[e["employeeId"]].hrs += (parseInt(e["excessTime"].split(":")[0]) + Math.floor((init[e["employeeId"]].mns + parseInt(e["excessTime"].split(":")[1]))/60)); 
     init[e["employeeId"]].mns = (init[e["employeeId"]].mns + parseInt(e["excessTime"].split(":")[1]))%60; 
     init[e["employeeId"]].excessString = init[e["employeeId"]].mns > 9 ? init[e["employeeId"]].hrs + ":" + init[e["employeeId"]].mns : init[e["employeeId"]].hrs + ":0" + init[e["employeeId"]].mns; 
     return init; 
     } 
    }, {}); 

var arr = []; 
for (var prop in obj) arr.push({employeeId: prop, totalHours: obj[prop].timeString, excessTime: obj[prop].excessString}); 
console.log(arr); 

結果:

[{ 
     "employeeId": "101", 
     "totalHours": "3:01", 
     "excessTime": "5:15" 
    }, { 
     "employeeId": "102", 
     "totalHours": "2:15", 
     "excessTime": "3:45" 
    }] 

的jsfiddle :https://jsfiddle.net/v7eckcny/

+0

我得到遺漏的類型錯誤:無法設置屬性「小時'的undefined(...) – Yams

+0

它的工作。謝謝。 – Yams

+0

很高興幫助。 –

0

裏面你減少if條款,您將可以初始化init[e["employeeId"]]兩次 ,所以當你初始化你{hours , minutes}對象與{hrs,mns}而這就是爲什麼你在總小時得到NAN越來越取代了它第二次。

您需要初始化一次

init[e["employeeId"]] = {hours: parseInt(e["totalHours"].split(":")[0]),minutes: parseInt(e["totalHours"].split(":")[1]),hrs: parseInt(e["excessTime"].split(":")[0]),mns: parseInt(e["excessTime"].split(":")[1])}; 

對下面工作的代碼片段看看。

var input = [ 
 
    { 
 
     "employeeId": "101", 
 
     "totalHours": "1:46", 
 
     "excessTime": "2:15" 
 
    }, 
 
    { 
 
     "employeeId": "102", 
 
     "totalHours": "1:15", 
 
     "excessTime": "1:30" 
 
    }, 
 
    { 
 
     "employeeId": "101", 
 
     "totalHours": "1:15", 
 
     "excessTime": "3:00" 
 
    }, 
 
    { 
 
     "employeeId": "102", 
 
     "totalHours": "1:00", 
 
     "excessTime": "2:15" 
 
    } 
 
]; 
 

 
var obj = input.reduce(function(init, e){ 
 
    if (init[e["employeeId"]] == undefined){ 
 
     // here you need to change your code like below 
 
     init[e["employeeId"]] = {hours: parseInt(e["totalHours"].split(":")[0]),minutes: parseInt(e["totalHours"].split(":")[1]),hrs: parseInt(e["excessTime"].split(":")[0]),mns: parseInt(e["excessTime"].split(":")[1])}; 
 
     init[e["employeeId"]].timeString = e["totalHours"]; 
 
     init[e["employeeId"]].excessString = e["excessTime"]; 
 
     return init; 
 
     } else { 
 
     init[e["employeeId"]].hours += (parseInt(e["totalHours"].split(":")[0]) + Math.floor((init[e["employeeId"]].minutes + parseInt(e["totalHours"].split(":")[1]))/60)); 
 
     init[e["employeeId"]].minutes = (init[e["employeeId"]].minutes + parseInt(e["totalHours"].split(":")[1]))%60; 
 
     init[e["employeeId"]].timeString = init[e["employeeId"]].minutes > 9 ? init[e["employeeId"]].hours + ":" + init[e["employeeId"]].minutes : init[e["employeeId"]].hours + ":0" + init[e["employeeId"]].minutes; 
 

 
     init[e["employeeId"]].hrs += (parseInt(e["excessTime"].split(":")[0]) + Math.floor((init[e["employeeId"]].mns + parseInt(e["excessTime"].split(":")[1]))/60)); 
 
     init[e["employeeId"]].mns = (init[e["employeeId"]].mns + parseInt(e["excessTime"].split(":")[1]))%60; 
 
     init[e["employeeId"]].excessString = init[e["employeeId"]].mns > 9 ? init[e["employeeId"]].hrs + ":" + init[e["employeeId"]].mns : init[e["employeeId"]].hrs + ":0" + init[e["employeeId"]].mns; 
 
     
 
     return init; 
 
     } 
 
    }, {}); 
 

 
var arr = []; 
 
for (var prop in obj) arr.push({employeeId: prop, totalHours: obj[prop].timeString, excessTime: obj[prop].excessString}); 
 
console.log(arr);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

1

這是因爲是字符串,使用parseInt函數()將字符串轉換爲整數 這樣的例子:

var a = parseInt("10");