2017-04-19 12 views
0

次の関数では、コードで数値の代わりにNaNが返されます。この関数は基本的に配列内で取られたk連続した文字列で構成される最初の最長文字列の長さを計算します - strarrMath.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を返します。 この関数は基本的に、配列strarrで取られたk個の連続した文字列からなる最初の最長文字列の長さを計算します。しかし、もし私がreturn Math.max(parseInt(arrI))return Math.max(arrI)行を置き換えると、私のコードは正常に動作します。

私の質問は、arrIは文字列ではなく数字の配列であるためですが、明らかにそれは問題ではありません。どうして?

答えて

2

Math.maxは、配列をとることとして定義されていません。これは、離散的な引数を取ることとして定義されています。

アレイに適用する場合は、次の操作を実行できます。Math.max.apply(Math, arr)。 ES2015 +では、あなたはまた、スプレッド表記を使用することができます:あなたはそれでparseIntを投げたとき、それはあなたにNaNを与えていないMath.max(...arr)

理由は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);

関連する問題