2017-04-19 75 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);