정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소의 평균값을 return하도록 solution 함수를 완성해주세요.
function solution(numbers) {
var answer = 0;
return answer;
}
평균을 구하려면 배열 속 모든 숫자를 더한 후 배열의 길이 만큼 나눠주면 된다.
function solution(numbers) {
var answer = 0;
for(let i = 1; i <= numbers; i++){
answer += i
}
console.log(answer / numbers);
}
solution(10); // 배열이 들어와야함
이렇게 작성해도 동작은 한다.
하지만 numbers에는 배열이 들어오는데, 단일 숫자가 들어오는걸로 착각하여 잘못 작성했다.
function solution(numbers) {
var answer = 0;
numbers.forEach( (item) => {
answer += item;
});
return answer / numbers.length;
}
solution([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
배열로 받아온 숫자들은 모두 object 객체로 넘어오게 된다.
console.log(typeof numbers)를 찍어보면
라고 찍힌 것을 확인할 수 있고 해결하기 위해서 forEach문을 썼다.
// 1에다가 나머지 2~10을 순차적으로 돌면서 더해주게 된다.
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let sum = numbers.reduce((acc, cur) => acc + cur)
// return 55
acc에는 가장 첫번째 인자인 1이 들어가고, cur에는 2 부터 숫자가 순서대로 들어오게 된다.
여기에 initialValue를 추가하면 작동법이 더 쉬워진다.
//1이 아니라 지정해준 0 에다가 1 ~ 10 까지의 숫자를 더해준 값이 return 된다
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let sum = numbers.reduce((acc, cur) => acc + cur, 0)
// return 55
acc의 초기값은 배열의 0번째 요소로 자동 지정되는데, initialValue로 우리가 원하는 초기 값을 설정해 주는 것이다.
개인적으로 이렇게 해주면 코드가 더 직관적이게 보이는 것 같다.
하지만 초기값이 각 배열마다 달라야하는 상황에서는 오히려 독일지도...?
아무튼 reduce를 사용한 답변은 아래와 같다.
function solution(numbers) {
var answer = 0;
answer = numbers.reduce((acc,curr) => acc + curr) / numbers.length
return answer
}