람다는 괄호와 화살표를 이용해 표현합니다.블로거는 람다 형식의 연산자를 지원합니다.
Ramda 연산자
블로거에서 람다 표현식의 작동 방식을 보다 잘 이해하려면 데이터에 대한 지식과 다른 연산자에 대한 지식이 필요할지 모릅니다. 블로거에서 사용되는 람다식은 개별 인스턴스가 아닌 전체 데이터(라벨, 게시물, 주석 등)에 사용할 수 있는 중첩 연산자입니다.
형식은 다음과 같습니다.
operator (variable => expression)
variable는 변수 이름을 지정하는 것으로 임의의 문자열이 올 수 있으며, operator에는 다음 연산자들을 사용할 수 있습니다.
연산자 | 설명 |
---|---|
any |
주어진 조건이 하나라도 일치하면 출력 예: array any (var => boolean) |
all |
주어진 조건이 모두 일치하면 출력 예: array all (var => boolean) |
none |
주어진 조건이 하나라도 일치하면 출력되지 않음.(ANY 와 반대되는
기능입니다.) 예: array none (var => boolean) |
where |
주어진 조건과 일치하는 항목을 반환 예: array where (var => boolean) |
filter | where와 동일 예: array filter (var => boolean) |
first |
주어진 조건과 일치하는 첫 번째 항목을 반환 예: array first (var => boolean) |
map |
각 결과에 새로운 집합을 결합한 항목을 반환 예: array map (var => operand) |
count |
일치하는 항목의 수를 숫자로 반환 예: array count (var => boolean) |
연산자들의 형식은 아래 예제와 함께 살펴보겠습니다.
예제
[WHERE], [FILTER], [FIRST]
[where]를 사용하여 게시물 목록 중에서 '블로그' 단어와 일치하는 제목만 출력하는 코드입니다. [where] 대신 [filter]를 사용해도 됩니다.
<b:loop values='data:posts where (lb => lb.title contains "블로그")' var='item'>
<h1><data:item.title/></h1>
</b:loop>
<!--
결과:
구글 블로그 장점과 단점
네이버 블로그 장점과 단점
티스토리 블로그 장점과 단점
...
-->
[first]를 사용하여 '블로그' 단어와 일치하는 제목에서 첫 번째 게시물만 출력합니다.
<b:loop values='data:posts first (post => post.title contains "블로그")' var='item'>
<h1><data:item.title/></h1>
</b:loop>
<!--
결과:
구글 블로그 장점과 단점
-->
[ANY], [ALL], [NONE]
[any]를 사용하여 게시물에 라벨(label) 이름 중 'apple', 또는 'banana'를 하나라도 포함하고 있으면 결과를 출력합니다.
<b:with value='["apple", "banana"]' var='labelsList'>
<b:if cond='data:post.labels any (lb => lb.name in data:labelsList)'>
<h1>hello</h1>
</b:if>
</b:with>
[all]은 주어진 라벨의 개수와 이름이 모두 일치해야 출력됩니다. 두개의 라벨이 이외에 또다른 라벨이 있으면 불일치로 출력되지 않습니다.
<b:with value='["apple", "banana"]' var='labelsList'>
<b:if cond='data:post.labels all (lb => lb.name in data:labelsList)'>
<h1>hello</h1>
</b:if>
</b:with>
[none]은 [any]와 반대 기능입니다. any는 하나라도 일치하면 출력하지만 none은 하나라도 일치하면 출력하지 않습니다. 다시말해 'apple', 'banana'를 포함하지 않으면 출력합니다. 모두 불일치해야 출력됩니다.
<b:with value='["apple", "banana"]' var='labelsList'>
<b:if cond='data:post.labels none (lb => lb.name in data:labelsList)'>
<h1>hello</h1>
</b:if>
</b:with>
[map]
아래 예는 게시물의 제목 끝에 'hello' 단어를 붙여서 새로운 제목을 만들어 반환받습니다.
<b:loop values='data:posts map (lb => lb.title + " hello")' var='item'>
<h1><data:item/></h1>
</b:loop>
<!--
결과:
구글 블로그 장점과 단점 hello
네이버 블로그 장점과 단점 hello
티스토리 블로그 장점과 단점 hello
...
-->
[where]는 일치하는 항목을 직접 반환하지만 [map]으로 대체하면 결과를 true, false로 값으로 받을 수 있습니다.
다음은 찾는 단어와 일치하면 true, 아니면 false를 반환 받는 예제입니다.
<b:loop values='data:posts map (lb => lb.title contains "단어")' var='item'>
<h1><data:item/></h1>
</b:loop>
<!--
결과:
false
true
true
true
...
-->
[count]
[count]는 일치하는 결과 값을 숫자로 반환 받습니다. 예를 들어 게시물 제목에 '블로그' 단어를 포함하는 게시물의 수를 숫자로 반환 받습니다. 2개의 게시물을 찾았다면 숫자 2를 반환 받습니다.
<b:with value='data:posts count (lb => lb.title contains "블로그")' var='item'>
<h1><data:item/></h1>
</b:with>
<!--
결과:
2
-->
람다식의 중첩
중첩을 사용하려면 간단한 규칙이 필요합니다. 람다 안에 중첩을 시킬 때는 [any], [all], [none] 중 하나를 사용합니다. 예를 들어 게시물이 가지고 있는 라벨을 필터링하여 게시물 제목을 표시하려면 다음과 같이 작성합니다.
<b:loop values='data:posts where (lb1 => lb1.labels any (lb2 => lb2.name == "blogger"))' var='p'>
<data:p.title/>
</b:loop>
위 경우는 게시물 목록에서 라벨 이름과 일치하는 모든 게시물을 출력합니다.