Javascript返回NaN,它应该返回值

时间:2018-01-03 17:38:43

标签: javascript angularjs

所以我在数据库中有一个列,用于将用户的工作持续时间记录为分钟。我试图获得这个价值,并将其转换为HH:mm到每周工作小时数,但我一直陷入困境。

<td><strong>{{ Math.floor(teamUniqueHoursTotalPerUser[entry] / 1000 / 60 / 60) + 'h ' + Math.round(teamUniqueHoursTotalPerUser[entry] / 1000 / 60 % 60) + 'm' }}</strong></td>

我在数学方面很糟糕,所以试图找到一种方法只使用数学库来做到这一点,所以我可以在我学习的同时学习。目前,当没有价值时,我得到一个NaN。我想要的是看到Total:0h 0m,当没有值时。

在控制器中:

$scope.teamTimeInfoForCurrentWeek = {};

if (data != null) {

    var uniqueNamesArray = [];
    var uniqueHoursWorkedCurrentWeekPerUser = {};

    for (i = 0; i < data.length; i++) {
        var newUser = 0;
        data[i].Full_Name = data[i].Employee_Last_Name + ', ' + data[i].Employee_First_Name;

        if (uniqueNamesArray.indexOf(data[i].Full_Name) == -1) {
            uniqueNamesArray.push(data[i].Full_Name);
            newUser = 1;
        }

        if (data[i].Hours_Worked !== null && data[i].Hours_Worked >= 0) {

            data[i].Hours_Worked = moment.duration(data[i].Hours_Worked, 'minutes');
            if (newUser == 1) {
                uniqueHoursWorkedCurrentWeekPerUser[data[i].Full_Name] = moment.duration(data[i].Hours_Worked, 'minutes');
            }
            else {
                uniqueHoursWorkedCurrentWeekPerUser[data[i].Full_Name] += moment.duration(data[i].Hours_Worked, 'minutes');
            }
        }

        if (data[i].Lunch_Duration !== null && data[i].Lunch_Duration >= 0) {
            data[i].Lunch_Duration = moment.duration(data[i].Lunch_Duration, 'minutes');
        }
    }
    $scope.teamTimeInfoForCurrentWeek = data;
    $scope.teamHoursWorkedForCurrentWeek = uniqueHoursWorkedCurrentWeekPerUser;
    $scope.teamNameInfoForCurrentWeek = uniqueNamesArray;

我尝试过整合时刻,但是当我尝试创建一个时刻(分钟值,&#39;分钟&#39;)时,似乎在处理超过24小时的值时遇到问题。

感谢任何帮助。 Javascript还不是我的一杯茶。

4 个答案:

答案 0 :(得分:4)

如果没有值,则为undefined。对某些undefined应用数学运算时,会得到NaN(非数字)。因此,无论何时应用数学运算符,您要做的是确保任何可能变为undefined的变量都会产生0。您可以使用||运算符进行内联。

像这样:

Math.floor((teamUniqueHoursTotalPerUser[entry] || 0) / 1000 / 60 / 60)

答案 1 :(得分:0)

当您尝试在不强制输入数字的事物上使用数学运算符时,会得到NaN。我在代码中的任何地方都看不到teamUniqueHoursTotalPerUser,但我猜错teamUniqueHoursTotalPerUser[entry]正在回复undefinedundefined除以任何内容会给您NaN

答案 2 :(得分:0)

您可以在循环时默认变量。 看看如果缺少员工名字的模式,我将删除逗号。

同样,如果缺少Hours_Worked,那么我默认为0

for (i = 0; i < data.length; i++) {
    var newUser = 0;
    data[i].Full_Name = (data[i].Employee_Last_Name || '') + (data[i].Employee_First_Name ?  ', ' + data[i].Employee_First_Name : '');
    data[i].Hours_Worked = data[i].Hours_Worked || 0;

    ...
    ...
}

答案 3 :(得分:0)

在转换为数字时,NaN可能会导致值产生的情况很多。根据以下文档,可以在https://www.w3schools.com/jsref/jsref_isnan.asp

评估为teamUniqueHoursTotalPerUser[entry]的示例案例
  

isNaN(123)// false

     

isNaN(-1.23)// false

     

isNaN(5-2)// false

     

isNaN(0)// false

     

isNaN('123')// false

     

isNaN('Hello')// true

     

isNaN('2005/12/12')// true

     

isNaN('')// false

     

isNaN(true)// false

     

isNaN(未定义)// true

     

isNaN('NaN')// true

     

isNaN(NaN)// true

     

isNaN(0/0)// true

在转换为值def on_drawing_area_draw(self,widget,cr): global dimg mymutex.acquire() Gdk.cairo_set_source_pixbuf(cr, dimg.copy(), 0, 0) cr.paint() mymutex.release() 的数字之前,您只需要处理您的案例。