지난 글에 이어 CheckPoint2를 다루어본다.
별로 어렵진않았는데, 한 번 헷갈리니 머리가 복잡해져서 오래걸렸다.


0. salesTeam.js

문제에서 사용될 데이터이다.

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"
  },
  ...
] 

1. isAgeDiverse

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;
};

2. getTeenager

나이가 20미만인 사람의 fullName으로 조합해서 리턴해야 한다.
결과를 배열로 리턴해야 하므로 fillter+map을 이용한다.

function getTeenager(salesTeam) {
  return salesTeam
  .filter(data => data.age < 20)
  .map(data => `${data["name"]["first"]} ${data["name"]["last"]}`)
}

3. oldest

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}`
}

4. tenThousandClub

$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);
}

5. sumConsecutives

내가 고생했던, 그 문제다.
숫자로 구성된 배열을 받아 연속된 숫자는 합쳐서 리턴해야 한다.
예를 들면, [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;
}

6. unique

이게 마지막 문제인가...? 싶은 문제이다.
중복된 숫자를 제거한 배열을 리턴한다.
빈 배열에 숫자를 확인하고 없을 때만 push한다.
사실 언더바의 _.unique 때문에 쉽게 느껴질 수 있다.

function unique(array) {
  let res = [];
  array.forEach((num, i) => {
    !res.includes(num) && res.push(num);
  })
  return res;
}