2016-11-29 78 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");