簡體   English   中英

無法計算總小時數

[英]Not able to calculate total hours

我是JavaScript的新手。 我們有一個代碼可以根據“員工ID”添加總小時數。 下面的代碼顯示“excessTime”的正確結果。 但對於“totalHours”,它顯示的是“NaN”。 有沒有人知道它為什么在添加“totalHours”時顯示“NaN”以及如何修復它?

<!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"
    }
]

您正在嘗試為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/

這是因為是String,使用parseInt()將字符串轉換為整數,如下例所示:

var a = parseInt("10");

在你的reduce if子句中你初始化init[e["employeeId"]]兩次,所以當你第二次初始化你的{hours , minutes}對象被{hrs,mns}取代{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> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM