No jq, números podem ser comparados com os seguintes operadores relacionais e de igualdade.
| Comparação | Operador |
|---|---|
| Maior que | a > b |
| Maior ou igual a | a >= b |
| Menor que | a < b |
| Menor ou igual a | a <= b |
| Igual a | a == b |
| Diferente de | a != b |
O resultado da comparação é sempre um valor Boolean, ou seja, true ou false.
1 < 3, # => true
2 != 2, # => false
1 == 1.0 # => true
# All numbers are floating-points, so this is different syntax
# for the exact same value.
Os operadores de comparação acima também podem ser usados para comparar strings. Nesse caso, é aplicada uma ordem de dicionário (lexicográfica). A ordenação é pelo valor do codepoint Unicode.
"Apple" > "Pear", # => false
"a" < "above", # => true
"a" == "A" # => false
Você precisa tomar cuidado ao comparar duas variáveis que parecem conter valores numéricos, mas são do tipo string. Por causa da ordem de dicionário, o resultado não será o mesmo de comparar valores do tipo number.
10 < 2, # => false
"10" < "2" # => true (because "1" comes before "2")
O operador == do jq é como o === do JavaScript, no sentido de que coisas que "parecem" iguais, mas são de tipos diferentes, não são iguais.
"3" == 3 # => false
# the value on the left has type string,
# the value on the right has type number.
Dois arrays são iguais se todos os elementos correspondentes forem iguais.
[1, 2, 3] == [1, 2, 3] # => true
[1, 2, 3] == [1, 3, 2] # => false, different order
[1, 2, 3] == [1, 2, "3"] # => false, different types
Dois objetos são iguais se tiverem os mesmos pares chave-valor.
{name: "Joe", age: 42} == {age: 42, name: "Joe"} # => true
{name: "Joe", age: 42} == {age: 42, name: "Jane"} # => false
{name: "Joe", age: 42} == {age: "42", name: "Joe"} # => false
{name: "Joe", age: 42} == {age: 42, name: "Joe", height: 175} # => false
# comparisons will drill down as deeply as required
{a: {b: {c: [1, 2]}}} == {a: {b: {c: [1, 2]}}} # => true
{a: {b: {c: [1, 2]}}} == {a: {b: {c: [1, 2, 3]}}} # => false
A expressão condicional do jq é if A then B else C end.
O if-then-else é um filtro como todos os builtins do jq: ele recebe uma entrada e produz uma saída.
Se a expressão A produzir um valor "truthy", o filtro if avalia B.
Caso contrário, avalia C.
A entrada do filtro if será passada para B ou C.
42 | if . < 50 then "small" else "big" end # => "small"
5 | if . % 2 == 0 then . / 2 else . * 4 end # => 20
A cláusula else é opcional; as duas instruções a seguir são equivalentes.
if A then B else . end
if A then B end
Você pode adicionar mais condições com elif.
42 | if . < 33 then "small"
elif . < 66 then "medium"
else "big"
end
# => "medium"
Use quantas cláusulas elif você precisar.
Os únicos valores "falsos" no jq são: false e null.
Todo o resto é "verdadeiro", até o número zero, a string vazia, o array vazio e o objeto vazio.
Os operadores Boolean and e or podem ser usados para construir consultas complexas.
42 | if . < 33 or . > 66 then "big or small"
else "medium"
end
Para negar, use not. Isso é um filtro, não um operador.
42 | if (. < 33 or . > 66 | not) then "medium"
else "big or small"
end
O operador alternativo permite especificar um valor "padrão" caso uma expressão seja false ou null.
A // B
# This is identical to
if A then A else B end
Para demonstrar
[3, 5, 18] | add / 2 # => 13
[] | add / 2 # => error: null (null) and number (2) cannot be divided
[] | add // 0 / 2 # => 0
Neste exercício, você vai escrever um pouco de código para ajudar na sua preparação para comprar um veículo.
Você tem três tarefas: determinar se vai precisar tirar uma carteira de motorista; escolher entre dois veículos; e estimar um preço aceitável para um veículo usado.
Alguns tipos de veículos exigem carteira de motorista para serem conduzidos.
Considere que apenas os tipos "car" e "truck" exigem carteira; todo o resto pode ser conduzido sem carteira.
Implemente a função needs_license, que recebe o tipo de veículo e retorna um Boolean indicando se você precisa de carteira para aquele tipo de veículo.
"car" | needs_license
# => true
"bike" | needs_license
# => false
Você avaliou suas opções de veículos disponíveis.
Você conseguiu reduzir tudo a duas opções, mas precisa de ajuda para tomar a decisão final.
Implemente a função choose_vehicle, que recebe como entrada um array de dois veículos e retorna uma decisão, que é a opção que vem primeiro na ordem alfabética.
["Wuling Hongguang", "Toyota Corolla"] | choose_vehicle
# => "Toyota Corolla is clearly the better choice."
["Volkswagen Beetle", "Volkswagen Golf"] | choose_vehicle
# => "Volkswagen Beetle is clearly the better choice."
Agora que você tomou sua decisão, você quer garantir um preço justo na concessionária. Como você está interessado em comprar um veículo usado, o preço depende de quantos anos o veículo tem. Para uma estimativa aproximada, considere que, se o veículo tiver menos de 3 anos, ele custa 80% do preço original que tinha quando era novo. Se tiver mais de 10 anos, custa 50%. Se o veículo tiver pelo menos 3 anos, mas não mais de 10 anos, custa 70% do preço original.
Implemente a função resell_price, que aplica essa lógica usando if, elif e else.
Ela recebe um objeto com o preço original e a idade do veículo e retorna o preço estimado na concessionária.
{"original_price": 1000, "age": 1} | resell_price
# => 800
{"original_price": 1000, "age": 5} | resell_price
# => 700
{"original_price": 1000, "age": 15} | resell_price
# => 500
Crie sua conta no Exercism para aprender e dominar jq com 12 conceitos75 exercícios e mentoria humana de verdade, tudo de graça.