Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[04_week] users에서 원하는 값을 도출하기1 #4

Open
joeunha opened this issue Jan 24, 2018 · 4 comments

Comments

@joeunha
Copy link
Owner

commented Jan 24, 2018

users에서 원하는 값을 도출하기!

users

var users = [
  { id: 1, name: 'ID', age: 36 },
  { id: 2, name: 'BJ', age: 32 },
  { id: 3, name: 'JM', age: 34 },
  { id: 4, name: 'PJ', age: 27 },
  { id: 5, name: 'HA', age: 25 },
  { id: 6, name: 'JE', age: 26 },
  { id: 7, name: 'JI', age: 31 },
  { id: 8, name: 'MP', age: 23 }
];

원하는 값

  1. 30세 미만의 유저들의 이름 목록
  2. 30세 이상의 유저들의 나이의 총합
  3. 이름이 'JE'인 유저의 나이 (첫번째로 발견한 'JE')

유의 사항

  • 최대한 함수형으로 프로그래밍하고, 필요한 함수는 직접 만들어보세요.
  • 그동안 만들었던 functional.js 파일은 사용하지 마세요. (참고하셔도 좋습니다.)
  • 결과는 금요일 자정 이후로 올려주세요. (그 전에 완성하셨더라도 혼자봐주세요.)
  • 토요일에 함께 보며 공부해요. 😁
@jeemyeong

This comment has been minimized.

Copy link

commented Jan 27, 2018

var users = [
    { id: 1, name: 'ID', age: 36 },
    { id: 2, name: 'BJ', age: 32 },
    { id: 3, name: 'JM', age: 34 },
    { id: 4, name: 'PJ', age: 27 },
    { id: 5, name: 'HA', age: 25 },
    { id: 6, name: 'JE', age: 26 },
    { id: 7, name: 'JI', age: 31 },
    { id: 8, name: 'MP', age: 23 }
];

// 원하는 값
// 30세 미만의 유저들의 이름 목록
// 30세 이상의 유저들의 나이의 총합
// 이름이 'JE'인 유저의 나이(첫번째로 발견한 'JE')


console.log(
    map(filter(users, user => user.age < 30), user => user.name)
)

console.log(
    reduce(filter(users, user => user.age > 30), (memo, user) => memo + user.age, 0)
)

console.log(
    get(find(users, user => user.name === "JE"), "age")
)

function map(list, iter) {
    var i = -1; len = list.length; new_list = [];
    while (++i < len) {
        new_list.push(iter(list[i]));
    }
    return new_list;
}

function reduce(list, iter, memo) {
    var i = -1; len = list.length;
    memo = memo === undefined ? list[++i] : memo;
    while (++i < len) {
        memo = iter(memo, list[i]);
    }
    return memo;
}

function filter(list, pred) {
    var i = -1; len = list.length; new_list = [];
    while (++i < len) {
        if (pred(list[i])) {
            new_list.push(list[i]);
        }
    }
    return new_list;
}

function find(list, pred) {
    var i = -1; len = list.length; new_list = [];
    while (++i < len) {
        if (pred(list[i])) {
            return list[i];
        }
    }
    return null;
}

function get(obj, key) {
    return obj[key];
}
@joeunha

This comment has been minimized.

Copy link
Owner Author

commented Jan 27, 2018

// 1. 30세 미만의 유저의 이름 목록
go(users,
  filter(pipe(val('age'), lt(30))),
  map(val('name')),
  log
)

// 2. 30세 미만의 유저들의 나이의 총합
go(users,
  filter(pipe(val('age'), gt(30))),
  reduce((memo, user) => memo + user.age, 0),
  log
)

// 3. 이름이 'JE'인 유저의 나이
go(users,
  find(pipe(val('name'), eq('JE'))),
  val('age'),
  log
)

go(users,
  all(
    pipe(filter(pipe(val('age'), lt(30))), map(val('name')),),
    pipe(filter(pipe(val('age'), gt(30))), reduce((memo, user) => memo + user.age, 0)),
    pipe(find(pipe(val('name'), eq('JE'))), val('age'))),
  log
)

all과 multi return을 지원하는 go를 추가로 남겨둡니다. 나머지 함수는 지명님 코드에서 커링만 지원한다면 사용하실 수 있어요!

function mr(...args) { return args.__mr = true, args } 
function to_mr(arr) { return arr.__mr = true, arr }

function go() {
  return reduce(arguments, (se, fn) => se.__mr ? fn(...se) : fn(se));
}

function all(...fs) {
  return function(arg) { return go(fs, map(fn => fn(arg)), to_mr) }
}

go(10, 
  function(a) { return mr(a, 20) }, 
  function(a, b) { console.log(a, b) } // <-- 10, 20
)
@JeewhanR

This comment has been minimized.

Copy link

commented Jan 27, 2018

@joeunha

분명히 조금 더 잘 구현할 수 있는 방법들이 많을 것인데 지금 제 실력으로 구현 가능한 범위까지 구현해보았습니다..
https://gist.github.com/Eclatant/fc41424d2d9863012db5af11d9e9d28e

@joeunha

This comment has been minimized.

Copy link
Owner Author

commented Jan 28, 2018

@Eclatant
확인했습니다. 깔끔하게 정리해주셔서 감사해요 👍

@joeunha joeunha changed the title 4주차 복습 미션 [04_week] users에서 원하는 값을 도출하기 Feb 1, 2018

@joeunha joeunha changed the title [04_week] users에서 원하는 값을 도출하기 [04_week] users에서 원하는 값을 도출하기1 Feb 7, 2018

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
3 participants
You can’t perform that action at this time.