في 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
يمكن إضافة المزيد من الشروط باستخدام 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
يتيح لك العامل البديل تحديد قيمة "افتراضية" إذا كان التعبير خطأ أو 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 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.