2013-10-31 4 views
4

내가 codewars에 대한 몇 가지 문제를 해결하고이 같은 번호 목록에 문자열로 변환을 시도했다 :자바 스크립트지도 이상한 행동

[1, 0, 2, 9, 0, 4] 
: 예상 결과이 같은 것

"102904".split("").map(parseInt); 

는 그러나 대신 반환

[1, NaN, NaN, NaN, 0, 4] 

에서 그지도 목록의 각 요소에 적용한다고 생각 이는 1 자릿수의 문자열. 하나는베이스가 사용되지 않기 때문에 제대로 분석하는 것이 아니라 믿고 수 :

parseInt(x, 10)를 사용
"102904".split("").map(function(x){ return parseInt(x);}); 
[ 1, 0, 2, 9, 0, 4] 

, 그 결과를 변경하지 않습니다. 그러나 직접 파싱하여지도를 작성하십시오. NaN ...

Chrome과 Firefox에서 사용해 보았는데 동일한 결과가 나타납니다.

+1

잘 모르겠어요 무엇을 너는 묻고있어. ''102904 ".split (" "). Chrome 30에서 예상 결과를 반환하는 것처럼 보입니다. – Jasper

+0

그래, 삭제 하겠지만 내가 할 수없는 ... –

답변

1

Array.prototype.map에 콜백 제공 기능은 세 인수 받는다 : 어레이로부터

  • 요소를
  • 배열 인덱스
  • 배열 자체

가 제공한다면 parseInt에 대한 두 개의 인수, 두 번째는 radix –으로 처리되어 숫자를 구문 분석하는 숫자 기준이됩니다. 따라서 문자열은 pa입니다. 여기에 놀라운 행동이 기본 0을 (불가능한)를 사용하여, 결과가 1보다는 NaN 점이다이

string | base | result 
---------------------- 
1  | 0 | 1 
0  | 1 | NaN 
2  | 2 | NaN 
9  | 3 | NaN 
0  | 4 | 0 
4  | 5 | 4 

처럼 rsed. 가 제공되지 것처럼 parseInt0의 기수를 취급하기 때문입니다 :

기수가 정의되지 않았거나 0 (결석) 인 경우 자바 스크립트는이 다음과 같은 가정 (MDN docs)

+0

맙소사, 그지도가 3 개의 매개 변수를 전송하는 것을 잊어 버렸습니다. –

7

parseInt에는 두 번째 인수 - 기수가 포함됩니다.

문제는 - map이 항목 자체와 색인을 인수로 보냅니다.

문제의 숫자는 다음과 같습니다 0, 2, 9

이유는 무엇입니까?

  • 0 - 1이므로 NaN
  • 2 법적 기수 아니다 1로 전달 된 기수있다 - 기수 2 기지국에서 2로 통과 가능한 2 디지트 (0과 1 이다)
  • 아니다
  • 9 - 기수 여전히 9 (0, 1 및 2는 ) 유효 자릿수
1
"102904".split("").map(function(x, y){ console.log(x, y) }); 

복귀 아닌 3으로 통과

1 0 
0 1 
2 2 
9 3 
0 4 
4 5 

이 첫 번째 예에서, parseInt는 다음과 같이 호출되는 것을 의미 :

parseInt("1", 0); 
parseInt("0", 1); 
parseInt("2", 2); 
parseInt("9", 3); 
// ecc... 

당신은 숫자의 기수를 나타내는 (parseInt()에 두 번째 매개 변수로 반복의 인덱스를 전달하는 구문 분석).


가장 좋은 해결책은 이미 게시 한 코드로 두 번째 방법을 사용하는 것입니다.

+0

예, 부엌에 있었고 js가 다른 함수 언어와 달리지도에 여러 매개 변수를 전송한다는 것을 깨달았습니다. –