// list에서 특정 개수의 홀수를 찾아 그 숫자의 제곱을 더하기
<script>
function f1(limit, list) {
let acc = 0;
for (const a of list) {
if (a % 2) {
const b = a * a;
acc += b;
if (--limit == 0) break;
}
}
console.log(acc);
}
f1(3, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
</script>
for (const a of list)
: list 배열의 각 요소를 순회하는 루프
a
: list 배열의 현재 요소if (a % 2)
: a가 홀수인지 체크const b = a * a;
: 제곱을 계산acc += b;
: acc 변수에 b의 값을 더하기 (누적)if (--limit == 0) break;
: limit 변수를 하나 줄이고, 0이 되면 루프 종료else
가 없는 if
는 filter
로 바꿀 수 있다. if
하나는 filter
이다. <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>01/1</title>
<script src="../fx.js"></script>
</head>
<body>
<script>
function f1(limit, list) {
let acc = 0;
for (const a of L.filter(a => a % 2, list)) {
const b = a * a;
acc += b;
if (--limit == 0) break;
}
console.log(acc);
}
f1(3, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
</script>
if
문 대신에 L.filter(a => a % 2, list)
: list
에서 홀수만을 필터링한다. map
을 사용할 수 있다. <script>
function f2(limit, list) {
let acc = 0;
for (const a of L.map(a => a*a, L.filter(a => a % 2, list))) {
acc += a;
if (--limit == 0) break;
}
console.log(acc);
}
f2(3, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
</script>
L.filter
로 걸러진 값을 L.map
으로 제곱map
을 하며 a
가 들어오면 제곱for
문으로 하나씩 꺼내면서 더해지고 있음take
로 튜닝하여 사용할 수 있다. <script>
function f2(limit, list) {
let acc = 0;
for (const a of L.take(limit, L.map(a => a*a, L.filter(a => a % 2, list)))){
acc += a;
}
console.log(acc);
}
f2(3, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
</script>
L.take
로 값이 얼마나 남았든 최대 limit
만큼만 꺼내기reduce
를 사용할 수 있다. <script>
function f2(limit, list) {
console.log(
_.reduce( (acc, a) => acc + a,
0, // 초기값, 없어도 됨 (1부터 시작)
L.take(limit,
L.map(a => a * a,
L.filter(a => a % 2, list)))));
}
f2(3, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
</script>
➡️ add
로 빼주기
<script>
const add = (a, b) => a + b;
function f2(limit, list) {
console.log(
_.reduce(add,
L.take(limit,
L.map(a => a * a,
L.filter(a => a % 2, list)))));
}
f2(3, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
</script>
1) list
로 출발을 해서
2) 홀수만 걸러내서 (filter
)
3) 모든 값들을 제곱 (map
)
4) limit
까지만 뽑기로 예약 (take
)
5) 모두 뽑아가며 add
로 축약하며 출력한다.
➡️ go
를 이용해서 파이프라인 형태로 순서를 뒤집어 더 읽기 쉽게 만들기
<script>
const add = (a, b) => a + b;
function f2(limit, list) {
_.go(list,
L.filter(a => a % 2),
L.map(a => a * a),
L.take(limit),
_.reduce(add),
console.log);
}
f2(3, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
console.clear();
</script>
1) list
를 filter
해서
2) map
으로 제곱을 하고
3) limit
만큼만 가져가서
4) add
로 축약을 하며
5) 출력한다.