문자열을 정수 배열로 변환


92

다음 문자열 '14 2'을 두 개의 정수 배열로 변환하고 싶습니다 . 내가 어떻게 해 ?

답변:


88

당신은 수 .split()의 배열 얻기 위해 문자열 이 같은 숫자로 변환하기를 통해 다음 루프를 :

var myArray = "14 2".split(" ");
for(var i=0; i<myArray.length; i++) { myArray[i] = +myArray[i]; } 
//use myArray, it's an array of numbers

+myArray[i]방금 할 수 있는지 그들이있는 거 정수라면, 단지 숫자 변환을 할 수있는 빠른 방법입니다 :

for(var i=0; i<myArray.length; i++) { myArray[i] = parseInt(myArray[i], 10); } 

5
더 짧게 : for(var i=myArray.length; i--;) myArray[i] = myArray[i]|0;비트 단위 변환 및 더 짧은 루핑 사용
vsync 2011 년

1
또는 ES5 사용 :myArray.forEach(function(x,y,z){ z[y]=x|0 })
vsync 2011 년

3
@vsync-물론 ...하지만 어떤 컴파일러가 그보다 더 짧게 만들려고 할 때 왜 유지 관리가 고통 스럽습니까? :) 선명도는 몇 바이트의 추가 가치가 있습니다. 특히 한 번 축소하면 실제로 훨씬 길지 않을 때 더욱 그렇습니다.
Nick Craver

한 번은 게시 된 코드를 축소하지 않으므로 다른 사람들이 내 코드를 읽고 무슨 일이 일어나는지 볼 수 있고 두 번째로 비트 연산이 parseInt보다 훨씬 빠릅니다.
vsync 2011-06-09

5
@vsync-모든 브라우저에서 해당 주장을 테스트했는지 확인하십시오. 개인적으로 +가 더 읽기 쉽다고 생각합니다. 테스트를한다면 대부분의 최신 브라우저는 엔진에 따라 무시할만한 차이가 있습니다. 또한, 당신은을 제공 할 수 .min.js.js빠른 페이지로드 -이 오버 헤드 HTTP를 감소의 당신이 당신의 코드를 노출 할 경우 (이 그 쓸모에 대해 이후, 또는 안) ... 그 축약이 무명위한 것이 아닙니다 기억 사용자를 위해.
Nick Craver

213

최신 브라우저를위한 빠른 방법 :

'14 2'.split(' ').map(Number);

// [14, 2]`

1
아주 깨끗한 방법! 정상이어야합니다.
hazelnut

1
불알. 굉장합니다. 너무 신선하고 깨끗합니다.
Todd

2
+1하고 필요한 경우 이전 브라우저 지원을 위해 polyfill을 추가하십시오. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
qdev

1
좋지만 실제로 어떻게 작동합니까? Number 객체를 전달하고 있지만 어떻게 변환하는지 잘 모르겠습니다. 매핑 할 함수를 전달해야한다고 생각했습니다.
Jarg7

2
네, 맞습니다. Number ()는 map에 전달 된 함수이며 값을 변환합니다. 자세한 내용은 Todd의 답변을 확인하십시오.
xer0x

35

그래서 ... 오래된 실, 알아요,하지만 ...

편집하다

@RoccoMusolino는 좋은 캐치를 가졌습니다. 여기에 대안이 있습니다.

TL; DR :

 const intArray = [...("5 6 7 69 foo 0".split(' ').filter(i => /\d/g.test(i)))]

잘못된 :"5 6 note this foo".split(" ").map(Number).filter(Boolean); // [5, 6]

여기에 나열된 더 우아한 솔루션, 특히 @amillara 및 @Marcus의 아름다운 답변에는 미묘한 결함이 있습니다.

이 문제는 문자열 배열의 요소가 정수와 같지 않을 때 발생합니다 (입력에 대한 유효성 검사가없는 경우). 인위적인 예를 들어 ...

문제 :


var effedIntArray = "5 6 7 69 foo".split(' ').map(Number); // [5, 6, 7, 69, NaN]

분명히 PURE int 배열을 원하기 때문에 그것은 문제입니다. 솔직히 , 나는 내 스크립트에 SO 코드를 복사하여 붙여 넣을 때까지 이것을 잡지 못했습니다 ... : /


(약간 덜-볼러) 수정 :


var intArray = "5 6 7 69 foo".split(" ").map(Number).filter(Boolean); // [5, 6, 7, 69]

따라서 이제는 crap int 문자열이 있더라도 출력은 순수한 정수 배열입니다. 다른 사람들은 대부분의 경우 정말 섹시하지만, 나는 거의 내 대부분을 솔직하게 제공하고 싶었습니다 . 그래도 여전히 한 줄짜리입니다.

누군가 시간을 절약하기를 바랍니다!


1
나를 위해 충분히 볼러를 토트합니다. 고마워, 토드!
indextwo

5
문자열에 0이 하나 이상 포함되어 있으면 작동하지 않습니다. 0은 boolean = false로 변환되므로 부울 필터가이를 유지하지 않습니다.
Rocco Musolino 2016

1
당신은 대체 할 수 .filter(Boolean).filter( (x) => !Number.isNaN(x))
Bob9630

26
var result = "14 2".split(" ").map(function(x){return parseInt(x)});

5
모든 브라우저가이 기능을 지원하는 것은 아닙니다. IE에서 중단 될 것입니다. 이것은 JavaScript 1.6+ 기능입니다. 또한 다른 답변에 대해 항상 기수를 parseInt().
Nick Craver

2
.map추가 라이브러리없이 어떤 브라우저에서든 JS에서 사용할 수있는 때를 고대합니다 .
JAL

5

Tushar Gupta 답변의 대안은 다음과 같습니다.

'14 2'.split(' ').map(x=>+x);

// [14, 2]`

코드 골프에서는 1 개의 문자를 저장합니다. 여기서 "+"는 "단항 더하기"연산자이며 parseInt처럼 작동합니다.


3

먼저 문자열을 공백으로 분할합니다.

var result = '14 2'.split(' ');

그런 다음 문자열의 결과 배열을 정수로 변환합니다.

for (var i in result) {
    result[i] = parseInt(result[i], 10);
}

2
항상 기수 인수를에 전달해야합니다 parseInt(). 그렇지 않으면 거기에 8 진수를 얻을 수 있습니다.
Nick Craver

문자열로 시작하지 않는 경우 0, 또는 0x그것을 잘해야합니다.
Marcus Whybrow

1
그렇지 않다면 (어떻게 가정을 접두사로 붙 였는지 보시겠습니까?) ... 왜 모든 경우에 맞게 수정하는 데 필요한 3 개의 문자를 추가합니까?
Nick Craver

3

접근에 대한 요점 parseInt:

람다를 사용하거나 radix매개 변수를 parseInt에 지정할 필요가 없습니다 . parseFloat또는 Number대신 사용하세요.


원인:

  1. 작동 중입니다.

    var src = "1,2,5,4,3";
    var ids = src.split(',').map(parseFloat); // [1, 2, 5, 4, 3]
    
    var obj = {1: ..., 3: ..., 4: ..., 7: ...};
    var keys= Object.keys(obj); // ["1", "3", "4", "7"]
    var ids = keys.map(parseFloat); // [1, 3, 4, 7]
    
    var arr = ["1", 5, "7", 11];
    var ints= arr.map(parseFloat); // [1, 5, 7, 11]
    ints[1] === "5" // false
    ints[1] === 5   // true
    ints[2] === "7" // false
    ints[2] === 7   // true
  2. 더 짧습니다.

  3. 그것은 조금 더 빠르며-접근하지 않을 때 캐시를 활용합니다parseInt .

      // execution time measure function
      // keep it simple, yeah?
    > var f = (function (arr, c, n, m) {
          var i,t,m,s=n();
          for(i=0;i++<c;)t=arr.map(m);
          return n()-s
      }).bind(null, "2,4,6,8,0,9,7,5,3,1".split(','), 1000000, Date.now);
    
    > f(Number) // first launch, just warming-up cache
    > 3971 // nice =)
    
    > f(Number)
    > 3964 // still the same
    
    > f(function(e){return+e})
    > 5132 // yup, just little bit slower
    
    > f(function(e){return+e})
    > 5112 // second run... and ok.
    
    > f(parseFloat)
    > 3727 // little bit quicker than .map(Number)
    
    > f(parseFloat)
    > 3737 // all ok
    
    > f(function(e){return parseInt(e,10)})
    > 21852 // awww, how adorable...
    
    > f(function(e){return parseInt(e)})
    > 22928 // maybe, without '10'?.. nope.
    
    > f(function(e){return parseInt(e)})
    > 22769 // second run... and nothing changes.
    
    > f(Number)
    > 3873 // and again
    > f(parseFloat)
    > 3583 // and again
    > f(function(e){return+e})
    > 4967 // and again
    
    > f(function(e){return parseInt(e,10)})
    > 21649 // dammit 'parseInt'! >_<

알림 : Firefox에서는 parseInt약 4 배 더 빠르게 작동하지만 다른 것보다 느립니다. 총 : +e< Number< parseFloat<parseInt


0

재미로 나도 forEach(f())해결책을 던질 것이라고 생각 했습니다.

var a=[];
"14 2".split(" ").forEach(function(e){a.push(parseInt(e,10))});

// a = [14,2]

0
let idsArray = ids.split(',').map((x) => parseInt(x));

이 코드가 질문에 답할 수 있지만 문제를 해결하는 방법 및 / 또는 이유에 대한 추가 컨텍스트를 제공하면 답변의 장기적인 가치가 향상됩니다.
Badacadabra 2017-06-12

0

더 나은 한 줄 솔루션 :

var answerInt = [];
var answerString = "1 2 3 4";
answerString.split(' ').forEach(function (item) {
   answerInt.push(parseInt(item))
});

그것은 문자열이 아닙니다.
delroh

-3

우리에게 분할 기능 :

var splitresult = "14 2".split(" ");

3
이것은 숫자가 아닌 문자열 배열을 가져옵니다.
Nick Craver

아, 네, 잘못 읽었습니다. 나머지는 Marcus Whybrow 또는 Nick Craver의 답변을 참조하십시오.
pyvi 2010
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.