2017-04-19 78 views
0

在下面的功能体验的错误,我的代码返回NaN,而不是数量。该函数基本上计算第一个最长的字符串的长度,该字符串由k连续字符串组成 - strarr与Math.max和parseInt函数

function longestConsec(strarr, k) { 

    var n = strarr.length; 
    if(n === 0 || n < k || k<=0){ 
     return ""; 
     } 
     else{ 
     var arrI = [0,0,0,0]; 
     var max; 
     for (var i = 0; i<(strarr.length - k); i++){ 
     for(var j = i; j<(i+k); j++){ 
      arrI[i] += strarr[j].length; 
      } 
     } 
      max = arrI.indexOf(Math.max(arrI)); 
      return Math.max(arrI) //typeof(arrI[i]) for i {0,1,2,3} returns 'number' and arrI.length returns 4 

      } 
} 

console.log(longestConsec(["zone", "abigail", "theta", "form", "libe", "zas"], 2), "abigailtheta") 

在上面的函数中,我的代码返回NaN而不是数字。 该函数基本上计算由数组中的k个连续字符串组成的第一个最长字符串的长度 - strarr。但如果我用return Math.max(parseInt(arrI))替换return Math.max(arrI)行,那么我的代码工作正常。

我的问题是,它不应该的问题,因为arrI是数字,而不是字符串数组,但显然它。为什么?

回答

2

Math.max没有被定义为服用阵列,它被定义为采取离散的参数。

如果你想将它应用到一个数组,你可以:Math.max.apply(Math, arr)。在ES2015 +,你也可以使用传播符号:Math.max(...arr)

它没有给你NaN当你把parseInt它是parseInt强制将其参数字符串,然后分析该字符串的开始,停止移动的原因第一个无效字符,并返回到目前为止。当你一个数组强制转换成字符串,它强求每个条目的字符串,然后用逗号加入他们,所以例如[1, 2, 3, 4]变得"1,2,3,4"parseInt将解析1。实际上,你在做Math.max(arr[0]),这不是你要找的。

0

的问题是,需要Math.max每个号码作为自己的参数:Math.max(1, 2, 3, 4...)。这就是为什么Math.max(arrI)是NaN。你想要的是以下内容:Math.max.apply(null, arrI);