jq में संख्याओं की तुलना नीचे दिए गए रिलेशनल और समानता ऑपरेटरों से की जा सकती है।
| तुलना | ऑपरेटर |
|---|---|
| से बड़ा | a > b |
| से बड़ा या बराबर | a >= b |
| से छोटा | a < b |
| से छोटा या बराबर | a <= b |
| बराबर | a == b |
| बराबर नहीं | a != b |
तुलना का परिणाम हमेशा एक बूलियन वैल्यू होता है, यानी या तो true या 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.
ऊपर दिए गए ऑपरेटरों से स्ट्रिंग की तुलना भी की जा सकती है। ऐसे में शब्दकोश (लेक्सिकोग्राफिकल) क्रम लागू होता है। यह क्रम यूनिकोड कोडपॉइंट वैल्यू के अनुसार होता है।
"Apple" > "Pear", # => false
"a" < "above", # => true
"a" == "A" # => false
जब आप ऐसे दो वेरिएबल की तुलना करें जिनमें देखने में संख्याएँ लगती हों, लेकिन जिनका टाइप स्ट्रिंग हो, तो आपको सावधान रहना चाहिए। शब्दकोश क्रम के कारण परिणाम वही नहीं आएगा जो संख्या टाइप की वैल्यू की तुलना करने पर आता है।
10 < 2, # => false
"10" < "2" # => true (because "1" comes before "2")
jq का == ऑपरेटर JavaScript के === जैसा है: जो चीज़ें देखने में एक जैसी लगती हैं, लेकिन जिनके टाइप अलग हैं, वे बराबर नहीं होतीं।
"3" == 3 # => false
# the value on the left has type string,
# the value on the right has type number.
दो ऐरे तब बराबर होते हैं जब उनके सभी संगत एलिमेंट बराबर हों।
[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
दो ऑब्जेक्ट तब बराबर होते हैं जब उनके की-वैल्यू जोड़े एक जैसे हों।
{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
if एक्सप्रेशनjq का शर्त वाला एक्सप्रेशन if A then B else C end होता है।
if-then-else भी jq के बाकी सारे बिल्ट-इन की तरह एक फिल्टर है: यह एक इनपुट लेता है और एक आउटपुट देता है।
अगर एक्सप्रेशन A "सही" मानी जाने वाली वैल्यू देता है, तो if फिल्टर B का मूल्यांकन करता है।
वरना वह C का मूल्यांकन करता है।
if फिल्टर को मिला इनपुट B या C को भेजा जाता है।
42 | if . < 50 then "small" else "big" end # => "small"
5 | if . % 2 == 0 then . / 2 else . * 4 end # => 20
else क्लॉज़ वैकल्पिक है; नीचे दिए गए दोनों स्टेटमेंट एक जैसे हैं।
if A then B else . end
if A then B end
if स्टेटमेंटelif की मदद से और शर्तें जोड़ी जा सकती हैं।
42 | if . < 33 then "small"
elif . < 66 then "medium"
else "big"
end
# => "medium"
आप जितने चाहें उतने elif क्लॉज़ इस्तेमाल कर सकते हैं।
jq में "गलत" मानी जाने वाली बस दो वैल्यू हैं: false और null.
बाकी सब कुछ "सही" है, यहाँ तक कि शून्य संख्या, खाली स्ट्रिंग, खाली ऐरे और खाली ऑब्जेक्ट भी।
जटिल क्वेरी बनाने के लिए बूलियन ऑपरेटर and और or इस्तेमाल किए जा सकते हैं।
42 | if . < 33 or . > 66 then "big or small"
else "medium"
end
किसी वैल्यू को नकारने के लिए not इस्तेमाल कीजिए। यह ऑपरेटर नहीं, एक फिल्टर है।
42 | if (. < 33 or . > 66 | not) then "medium"
else "big or small"
end
अगर कोई एक्सप्रेशन false या null हो, तो वैकल्पिक ऑपरेटर की मदद से आप उसके लिए एक "डिफॉल्ट" वैल्यू तय कर सकते हैं।
A // B
# This is identical to
if A then A else B end
उदाहरण देखिए:
[3, 5, 18] | add / 2 # => 13
[] | add / 2 # => error: null (null) and number (2) cannot be divided
[] | add // 0 / 2 # => 0
इस अभ्यास में आप वाहन खरीदने की तैयारी में मदद करने के लिए कुछ कोड लिखेंगे।
आपके सामने तीन काम हैं: यह तय करना कि आपको ड्राइविंग लाइसेंस लेना पड़ेगा या नहीं; दो वाहनों में से एक चुनना; और किसी पुराने वाहन का उचित दाम अनुमान लगाना।
कुछ किस्म के वाहनों को चलाने के लिए ड्राइविंग लाइसेंस ज़रूरी होता है।
मान लीजिए कि सिर्फ "car" और "truck" किस्मों के लिए लाइसेंस ज़रूरी है; बाकी सब बिना लाइसेंस के चलाए जा सकते हैं।
needs_license फंक्शन बनाइए जो वाहन की किस्म लेता है और एक बूलियन लौटाता है, जो बताता है कि उस किस्म के वाहन के लिए आपको लाइसेंस चाहिए या नहीं।
"car" | needs_license
# => true
"bike" | needs_license
# => false
आपने उपलब्ध वाहनों के अपने विकल्पों पर विचार कर लिया है।
आप उन्हें घटाकर दो विकल्पों तक ले आए हैं, लेकिन अंतिम फैसला करने में आपको मदद चाहिए।
choose_vehicle फंक्शन बनाइए जो इनपुट के रूप में दो वाहनों का ऐरे लेता है और एक फैसला लौटाता है, यानी वह विकल्प जो डिक्शनरी क्रम में पहले आता है।
["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."
अब जब आपने फैसला कर लिया है, तो आप यह सुनिश्चित करना चाहते हैं कि डीलरशिप पर आपको उचित दाम मिले। चूँकि आप एक पुराना वाहन खरीदना चाहते हैं, इसलिए दाम इस पर निर्भर करता है कि वाहन कितना पुराना है। मोटे अनुमान के लिए मान लीजिए कि अगर वाहन 3 साल से कम पुराना है, तो उसका दाम उसके बिल्कुल नए होने के समय की मूल कीमत का 80% होता है। अगर वह 10 साल से ज़्यादा पुराना है, तो उसका दाम 50% होता है। अगर वाहन कम से कम 3 साल पुराना है लेकिन 10 साल से ज़्यादा पुराना नहीं है, तो उसका दाम मूल कीमत का 70% होता है।
resell_price फंक्शन बनाइए जो if, elif और else का उपयोग करके यह तर्क लागू करता है।
यह एक ऑब्जेक्ट लेता है जिसमें मूल कीमत और वाहन की उम्र रखी होती है, और डीलरशिप पर अनुमानित दाम लौटाता है।
{"original_price": 1000, "age": 1} | resell_price
# => 800
{"original_price": 1000, "age": 5} | resell_price
# => 700
{"original_price": 1000, "age": 15} | resell_price
# => 500
Exercism पर साइन अप कीजिए और jq को 12 कॉन्सेप्ट75 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।