지난 글에 이어 CheckPoint2를 다루어본다.
별로 어렵진않았는데, 한 번 헷갈리니 머리가 복잡해져서 오래걸렸다.
문제에서 사용될 데이터이다.
var salesTeam = [
{
"name": {
"first": "Bruce",
"last": "Wayne"
},
"age": 26,
"sales": "$2314"
},
{
"name": {
"first": "Alvaro",
"last": "Angelos"
},
"age": 55,
"sales": "$1668"
},
{
"name": {
"first": "Denese",
"last": "Dossett"
},
"age": 29,
"sales": "$9248"
},
...
]
list에서 age가 모두 10~90이면 true. 그 외엔 false이다.
forEach로 각 obj에 접근해주면 된다.
let isAgeDiverse = function(list) {
let isTrue = true;
list.forEach(item => (item.age < 10 || item.age > 90) && (isTrue = false))
return isTrue;
};
나이가 20미만인 사람의 fullName으로 조합해서 리턴해야 한다.
결과를 배열로 리턴해야 하므로 fillter+map을 이용한다.
function getTeenager(salesTeam) {
return salesTeam
.filter(data => data.age < 20)
.map(data => `${data["name"]["first"]} ${data["name"]["last"]}`)
}
salesTeam에서 가장 나이 많으신 분을
"The oldest student is Tina Fey"
와 같은 문자열로 리턴한다.
나이가 동일하다면 우선순위상 앞쪽을 리턴한다.
나이만 filter하여 가장 높은 나이를 찾고, 일치하는 값을 리턴하였다.
function oldest(salesTeam){
const MAX_AGE = Math.max(...salesTeam.map(data => data.age));
const OLDEST = salesTeam
.filter(data => data.age === MAX_AGE)
.map(data => `${data["name"]["first"]} ${data["name"]["last"]}`)[0];
return `The oldest student is ${OLDEST}`
}
$10,000가 넘는 사원만 fullName으로 조합하여 배열로 리턴한다.
숫자 비교를 위해 +로 number타입으로 바꿔준 후 filter한다.
아래 함수는 문제 해결을 위해 사용하라고 하는데, 굳이 필요없다.
function tenThousandClub(salesTeam){
return salesTeam
.filter(data => +data.sales.slice(1) > 10000)
.map(data => `${data["name"]["first"]} ${data["name"]["last"]}`)
}
function salesToNumber(salesString){
// return +salesString.slice(1);
// return +salesString.substr(1);
}
내가 고생했던, 그 문제다.
숫자로 구성된 배열을 받아 연속된 숫자는 합쳐서 리턴해야 한다.
예를 들면, [1, 4, 4, 4, 2, 3] => [1, 12, 2, 3] 이런 식이다.
당연히 개수를 찾아서 숫자에 곱하고 나머지는 뺀다.
이런식으로만 생각해서 계속 어렵게 해결하려고 생각했다.
단순하게, 순회하면서 같다면 count를 하여 개수만큼 곱하고, count를 초기화한다.
같지 않을 때만 빈 배열에 push하면 쉽게 해결할 수 있다.
function sumConsecutives(s) {
let res = [];
let count = 1;
s.forEach((n, i) => s[i] === s[i + 1] ? count++ : res.push(n * count) && (count = 1));
return res;
}
이게 마지막 문제인가...? 싶은 문제이다.
중복된 숫자를 제거한 배열을 리턴한다.
빈 배열에 숫자를 확인하고 없을 때만 push한다.
사실 언더바의 _.unique 때문에 쉽게 느껴질 수 있다.
function unique(array) {
let res = [];
array.forEach((num, i) => {
!res.includes(num) && res.push(num);
})
return res;
}