이 문제를 풀 당시에는 for문으로 순회하면서 각 원소에 2배를 해줬는데, 지금 다시 푼다면 map을 써볼 것 같다.
function solution(numbers) {
for(let i=0; i<numbers.length; i++){
numbers[i]*=2;
}
return numbers;
}
위 메서드는 배열 내의 모든 요소 각각에 대해 주어진 함수를 호출한 결과를 모아 '새로운 배열'을 반환한다.
function solution(numbers) {
return numbers.map(e=>e*2);
}
arr.map(callback(currentValue[, index[, array]])[, thisArg])
1. currentValue: 처리할 현재 요소
2. index(option): 처리할 현재 요소의 인덱스
3. array(option): map()을 호출한 배열
콜백함수는 배열 값이 들어있는 인덱스에 대해서만 호출된다.
즉, 함수 호출 후에 값이 삭제되거나 아직 값이 할당/정의되지 않은 인덱스에는 호출되지 않는다!
map()은 새로운 배열을 반환하기 때문에 원본 배열을 변형하지 않는다.
var numbers = [1, 4, 9];
var roots = numbers.map(Math.sqrt);
// roots는 [1, 2, 3]
// numbers는 그대로 [1, 4, 9]
객체 배열도 재구성할 수 있다.
var numbers = [1, 4, 9];
var roots = numbers.map(Math.sqrt);
// roots는 [1, 2, 3]
// numbers는 그대로 [1, 4, 9]
https://blog.naver.com/lcyeon46/223087120945
https://blog.naver.com/lcyeon46/223087751613
https://blog.naver.com/lcyeon46/223087935465
function solution(numbers) {
return numbers.reduce((a, b) => [...a, b * 2], []);
}
//spread연산자
const animals = ['개', '고양이', '참새'];
const anotherAnimals = [...animals, '비둘기'];
console.log(animals);
//['개', '고양이', '참새']
console.log(anotherAnimals);
//['개', '고양이', '참새', '비둘기']
우선 하나의 배열로도 반환이 될 수 있다는 것을 알았고, a는 배열로써 어떤 값을 누적하게 되는데...
예를 들어 [0, 1, 2, 3]라는 배열에 대해 위 코드를 적용한다면,
callback | accumulator | currentValue | currentIndex | array | 반환 값 |
---|---|---|---|---|---|
1번째 호출 | [] | [0] | 0 | [0, 1, 2, 3] | [0] |
2번째 호출 | [0] | [2] | 1 | [0, 1, 2, 3] | [0, 2] |
3번째 호출 | [0, 2] | [4] | 2 | [0, 1, 2, 3] | [0, 2, 4] |
4번째 호출 | [0, 2, 4] | [6] | 3 | [0, 1, 2, 3] | [0, 2, 4, 6] |
이렇게 된다!
아직 reduce랑 spread 연산자에 익숙하지 않아서 이해하는 데에 좀 걸렸다.
출처
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map