Expresion Lambda en Blogger

min

La expresión lambda nos permite comprobar si alguno, todos o ninguno de los elementos de un conjunto de datos cumple con una condición. También nos permite comprobar o crear un nuevo arreglo con los datos de un ciclo b:loop. Su sintaxis es la siguiente:


[array] [operador lambda] ([variable] => [boolean])

Que dependiendo del operador lambda, puede formar parte de una condición o de un ciclo:


<b:[tag] cond='[array] [operador] ([variable] => [boolean])'/>
<b:loop values='[array] [operador] ([variable] => [boolean])' var='[variable]'/>

En la siguiente tabla podemos encontrar la cantidad de operadores disponibles, su sintaxis individual y el tipo de datos que devuelven.


Any (Alguno) [array] any ([variable] => [boolean]) true/false
All (Todos) [array] all ([variable] => [boolean]) true/false
None (Ninguno) [array] none ([variable] => [boolean]) true/false
Count (Contar) [array] count ([variable] => [boolean]) número
Filter/Where (Filtro) [array] filter ([variable] => [boolean]) Nuevos datos
First (Primero) [array] first ([variable] => [boolean]) Nuevos datos
Map/Select (Mapear) [array] map ([variable] => [allType]) Nuevos datos

Ejemplos de uso

En este ejemplo vamos a verificar si entre todas las entradas del blog, existe alguna creada por el autor "Demo-chan".


<b:if cond='data:posts any (p => p.author == "Demo-chan")'>
   <!-- Si entre las entradas, alguna fue publicada por "Demo-chan" [true] -->
</b:if>

No es necesario que la expresión se encuentre dentro de un bucle, debido a que el conjunto de datos de las entradas puede ser manejado por la expresión lambda.


Ahora vamos a comprobar si una etiqueta se encuentre o no dentro de un conjunto de datos. Nuevamente estos datos los puede manejar la expresión, si anidamos expresiones de la siguiente forma:


<b:if cond='data:posts any (p => p.labels none (l => l.name == "CSS"))'>
   <!-- Si entre las etiquetas ninguna es "CSS" [true] -->
</b:if>

En el ejemplo anterior, comprobamos que ninguna lleve de nombre "CSS", si no existe ninguna la condición devuelve verdadero. Ahora vamos a repasar cada operador y su función dentro de la expresión lambda.


Operador ANY

Sirve para comprobar si un determinado valor forma parte de un conjunto de datos. En este ejemplo comprobamos si entre todas las entradas, alguna lleva un título en específico:


<b:if cond='data:posts any (p => p.title == "Entrada para Demo-chan")'>
   <!-- Si entre las entradas, alguna lleva de título "Entrada para Demo-chan" [true] -->
</b:if>

En este otro ejemplo, comprobamos si entre todas las etiquetas, una de ellas lleva de nombre "demo". En este caso la condición se ejecutará dentro de un ciclo de entradas, por lo tanto solo usamos la variable "post" del bucle.


<b:loop values='data:posts' var='post'>
    <b:if cond='data:post.labels any (l => l.name == "demo")'>
        <!-- Si entre las etiquetas existe una llamada "demo" [true] -->
    </b:if>
</b:loop>

Operador ALL

Sirve para comprobar todos los valores de un conjunto de datos. Por ejemplo:


<b:if cond='data:post.labels all (l => l.name in ["blogger","google","demo"])'>
    <!-- Si todas las etiquetas son "blogger, google y demo" [true] -->
</b:if>

Para que el código anterior sea verdadero, la entrada debe tener únicamente las etiquetas blogger, google y demo. Si existiera una etiqueta extra o faltara alguna entonces la condición devolvería falso.


Operador NONE

Este operador comprueba que uno o varios valores no se encuentren dentro de un conjunto de datos. Por ejemplo:


<b:if cond='data:posts none (p => p.author == "Demo-chan")'>
   <!-- Si entre las entradas, ninguna fue publicada por "Demo-chan" [true] -->
</b:if>

La condición anterior devuelve verdadero, si entre todas las entradas, ninguna fue publicado por Demo-chan.


Operador COUNT

Cuenta los valores que devuelven verdadero dentro de la expresión. Por ejemplo:


<b:if cond='data:post.labels count (l => l.name in {"blogger","google"}) >= 1'>
   <!-- Si la cantidad de valores que devuelven verdadero es mayor o igual a 1 [true] -->
</b:if>

Para que la condición anterior se cumpla, la entrada deberá tener las etiquetas blogger y google, o al menos una de las dos. En caso de que no cuente con ninguna devolverá falso.


Operador FILTER/WHERE

Filtra los datos seleccionados dentro de un conjunto de datos, solo se puede utilizar en ciclos b:loop. Por ejemplo:


<b:loop values='data:post.labels filter (l => l.name != "blogger")' var='label'>
   <!-- Se retira la etiqueta "blogger" dentro del bucle de etiquetas -->
</b:loop>

En el ejemplo anterior, se compara el nombre de las etiquetas, para que no sea "blogger", provocando que en el ciclo ésta última no aparezca.


Operador MAP/SELECT

Devuelve un conjunto de datos que contiene los resultados de la expresión lambda, pero requiere bucles o ciclos b:loop. Por ejemplo:


<b:loop values='data:post.labels map (l => "#" + l.name)' var='label'>
   <span><data:label/></span>
</b:loop>

El código anterior creará un grupo de etiquetas que corresponden a la entrada, pero cada una tendrá una almohadilla al inicio del nombre. El valor resultante será mostrado dentro de la variable del bucle <data:label/>, por lo tanto no se pueden usar las etiquetas data que normalmente corresponden al ciclo, en este caso serían <data:label.name/> y <data:label.url/>.


Operador FIRST

Filtra los valores dentro de un conjunto de datos, pero solo muestra el primer valor que devuelve verdadero. Por ejemplo:


<b:loop values='data:post.labels first (l => l.name != "asus")' var='label'>
   <!-- Devuelve verdadero si una de las etiquetas no es "asus", pero solo 
   muestra la primera etiqueta que cumpla la condición -->
</b:loop>

Para entender el código anterior, supongamos que tenemos una entrada con las etiquetas asus, blogger y google. La primera etiqueta no cumple la condicion, entonces pasa a la siguiente y esta si devuelve verdadero, como es la primera que cumple la condición solo se mostrará "blogger".


La expresión Lambda nos agrega mayor flexibilidad para la creación de plantillas personalizadas, si tienes alguna duda no dudes en comentar.