26번
- 객체를 요소로 갖는 배열과 문자열을 입력받아 각 요소의 동물 속성값이 문자열과 일치할 경우, 해당 요소의 점수 속성값을 모두 더한 값을 리턴
- 먼저 문자열과 일치하는 경우로 filter를 해주고, reduce로 점수를 응축하려고 했지만 reduce만 써도 되는 문제였다.
이 문제를 풀면서 , reduce를 사용할 때 조건으로 필터링도 되는 느낌을 받았다
let maxNum = arr.reduce((acc, cur) => {
if(cur.property === value){
return acc + cur.score;
}
return acc;
}, 0)
return maxNum;
27번
- 문자열을 요소로 갖는 배열을 입력받아 가장 긴 문자열을 리턴
- 객체는 dot notation으로 원하는 속성값에 접근할 수 있었는데,
문자열로만 구성되어있는 배열에는 reduce로 어떻게 접근해야할지 고민이 됐었다.
- 초기 값을 string으로 줄 때는 ''으로 해줘도 된다.
- 길이가 같으면 앞에 값을 리턴해야하니까 이상으로 조건을 줘서 같을 경우는 acc를 리턴하면 된다.
28번
- 문자열을 요소로 갖는 배열을 입력받아 가장 긴 문자열의 길이를 리턴
- 길이를 비교해서 누적값이 크면 누적값의 길이를 리턴하고, 그렇지 않으면 현재값의 길이를 리턴한다고 코드를 짰는데 틀렸다.
- }).length로 코드를 짜야 맞는 답이었다.
29번
- 2차원 배열을 입력받아 배열들의 요소를 모두 담고 있는 단일 배열을 리턴해야한다.
- concat을 사용할 생각은 하였는데 parameter가 하나 뿐이라 안에 넣어줄 값이 떠오르지 않았었다.
- reduce를 사용해서 누적값배열 안에 현재 배열을 넣어서? 리턴하였다.
let output = joinArrayOfArrays([
[1, 4],
[true, false],
['x', 'y'],
]);
console.log(output);
30번
- 배열을 입력받아 배열에서 가장 짧은 길이를 가진 문자열 요소를 리턴
- Cautions
- 같은 길이의 요소가 있다면 앞쪽에 있는 요소 리턴. => 이하,이상 조건사용
- 배열에는 문자열 외에 다른 요소들이 있을 수 있다. => 필터링먼저하고 그 변수를 가져오기.
- 빈 배열을 입력받은 경우 , 빈 문자열을 리턴.
- 주어진 배열에 문자열이 없다면, 빈 문자열 리턴.
- filter로 문자열만 있는 배열로 만들어주고
- 그 배열을 가져와서 가장 작은 문자열을 찾으려고 reduce를 사용한건 좋았는데, 조건을 코드로 짤 때, 빈 배열이 아니라 빈 문자열을 리턴하는 걸 착각했다. 그리고 acc,cur 구조를 아직 잘 이해 못 한 것 같다.
31번
function studentReports(students) {
let onlyFemale = students.filter((el)=> {
if(el.gender === 'female'){
return true;
}
return false;
})
return onlyFemale.map((el) => {
let num = el.grades.reduce((acc, cur) => {
return acc + cur;
}, 0)
let avg = num / el.grades.length;
el.grades = avg;
return el;
});
}
- filter로 여학생들만 있는 배열로 바꿔준다.
- 여학생들만 존재하는 배열을 map으로 가져오고(같은배열의길이), 그 안에서 grades 속성값만 reduce를 해서 모두 합쳐주고, 그 길이로 나눠준 값을 안에서 새로 선언한 변수에 할당해주고 grade속성값을 평균값으로 바꿔준 값으로 재할당 해준다.
32번 마지막문제
function sumOfArraysInArray(arr) {
let oneArr = arr.reduce((acc, cur) => {
return acc.concat(cur);
})
let onlyNum = oneArr.filter((el) => {
if(typeof(el) === 'number'){
return true;
}
return false;;
})
if(onlyNum.length === 0){
return 0;
}
return onlyNum.reduce((acc, cur) => {
return acc + cur;
})
}
- 우선 2차원 배열을 하나로 합쳐주고,
- 하나로 합친 배열을 가져와서 number type만 있는 배열로 필터링을 해줬다.
- 처음엔 조건을 주지 않았었는데 필터링한 배열이 빈 배열이면 0을 리턴하는 조건을 줘서 통과하지 못한 케이스를 충족시켰다.
- number type만 있는 배열을 다시 reduce로 모든 값을 더해줘서 하나의 값으로 바꿔주었다.