Javascript/method

Array.map()

안개바다 2023. 3. 11. 14:41

Array.map()

Array.map()은 입력한 함수를 배열의 모든 원소에 적용해 주는 메소드이다.

예를 들어

let arr = [1,2,3,4,5,6,7,8,9];
arr.map((el)=>2*el);
console.log(arr.map((el)=>2*el))
=> [2, 4, 6, 8, 10, 12, 14, 16, 18]

함수는 map 내부에서 선언해도 되고 함수가 복잡해지면 외부에서 선언하는 것이 권장됩니다.

 

Array.map은 다른 방식으로도 사용 할 수 있습니다.

let a = Array.prototype.map.call('1234552354', el => Number(el));
console.log(a) => [1, 2, 3, 4, 5, 5, 2, 3, 5, 4]
//Array.protype.map을 따로 선언 후 사용해도 됩니다.
let map = Array.prototype.map;
let a = map.call('1234552354', el => Number(el));
console.log(a) => [1, 2, 3, 4, 5, 5, 2, 3, 5, 4]

{주의 사항}

알고리즘 문제를 풀때 Array.map을 자주 사용하게 되는데

이때 배열안의 소수들에 한번에 반올림 하거나 해야 할 필요가 있다.

이때 parseInt를 사용시 문제가 된다.

[4.123, 3.25, 6.315235].map(parseInt);
=>[4, NaN, NaN]
----------------------------------------
[4.123, 3.25, 6.315235].map(Math.round);
=>[4, 3, 6]

이 문제는 MDN을 통해 확인한 결과 Array.map은 콜백함수에 배열의 값, 값의 인덱스, 그리고 배열 이렇게 3가지의 값을 전달 하지만 

parseInt에서는 앞의 두개 값만 인식하기 때문에 발생하는 문제라고 한다. 

※참고 사이트 http://wirfs-brock.com/allen/posts/166

 따라서 이 경우에는 두 가지 해결 방법이 있다.

첫 번째 유사한 기능인 Math.round() 메소드를 사용해서 처리한다.
[4.123, 3.25, 6.315235].map(Math.round);
=> [4, 3, 6]

두 번째 값을 선언해서 잡아준다.
[4.123, 3.25, 6.315235].map(el => parseInt(el));
=> [4, 3, 6]

위와 같은 방법으로 해결 해 볼 수 있다.