无法计算总小时
问题描述:
我是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"
}
]
答
您正试图分配值hours
和minutes
性质,但他们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/
答
里面你减少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>
答
这是因为是字符串,使用parseInt函数()将字符串转换为整数 这样的例子:
var a = parseInt("10");
我得到遗漏的类型错误:无法设置属性“小时'的undefined(...) – Yams
它的工作。谢谢。 – Yams
很高兴帮助。 –