يعرّف JSON المصفوفة بأنها:
المصفوفة مجموعة مرتّبة من القيم. تبدأ المصفوفة بالقوس المربع الأيسر
[وتنتهي بالقوس المربع الأيمن]. وتُفصل القيم بفاصلة,.
يمكن أن تحتوي المصفوفة على صفر أو أكثر من قيم JSON من أي نوع. ولا يلزم أن تكون كل عناصر المصفوفة من النوع نفسه.
استخدم الأقواس المربعة لتجميع العناصر في مصفوفة.
[1, 2, 3]
يمكن التقاط عناصر التدفق في مصفوفة بوضعها بين قوسين.
range(5) # => a stream of 5 numbers
[range(5)] # => the array [0, 1, 2, 3, 4]
تُرجع الدالة length عدد العناصر في المصفوفة.
تبدأ فهرسة المصفوفة من الصفر.
استرجع عنصرًا من المصفوفة بتعبير قوسي:
يحضر .[2] العنصر الثالث.
تُعدّ الفهارس السالبة من نهاية المصفوفة إلى الخلف:
يحضر .[-1] العنصر الأخير، و.[-2] العنصر قبل الأخير.
الشريحة متتالية فرعية من المصفوفة.
تُرجع .[10:15] خمسة عناصر بدءًا من الفهرس 10، ولا يُضمَّن فهرس النهاية.
وهناك بعض الدوال المساعدة:
first العنصر الأول.last العنصر الأخير.nth(n) العنصر عند الفهرس n.هناك حالات نريد فيها بثّ عناصر المصفوفة فرادى.
ولهذا نستخدم .[].
لنفترض أننا نريد تدفقًا بأطوال السلاسل النصية في مصفوفة.
["a", "be", "cat", "door"] | length # => 4 -- the number of elements in the array
["a", "be", "cat", "door"] | .[] | length # => 1, 2, 3, 4 -- the lengths of each element
يمكن وضع القوسين الفارغين بجوار التعبير السابق مع حذف الأنبوب.
["a", "be", "cat", "door"][] | length # => 1, 2, 3, 4 -- the lengths of each element
# ........................^^
استخدم + لدمج المصفوفات.
[1, 2, 3] + [4, 5] # => [1, 2, 3, 4, 5]
يحذف العامل - العناصر الموجودة في المصفوفة اليمنى من المصفوفة اليسرى.
[range(10)] - [2, 4, 6] # => [0, 1, 3, 5, 7, 8, 9]
يوفّر jq دوال كثيرة تغطي وظائف التكرار الشائعة:
تُرجع map(expr) مصفوفة جديدة يُطبَّق فيها expr على كل عنصر بالتتابع.
[1, 2, 3] | map(. * 10) # => [10, 20, 30]
select(expr) دالة تطبّق expr على قيمة واحدة؛
فإذا كانت نتيجة التعبير صحيحة أُرجعت القيمة،
وإذا كانت خاطئة فلا يُرجع شيء، ليس null بل لا شيء فعليًا.
ولتطبيق ذلك على مصفوفة، ادمجه مع map.
[range(10)] | map(select(. % 2 == 0)) # => [0, 2, 4, 6, 8]
أو طبّق select على تدفق واجمع النتائج.
[range(10) | select(. % 2 == 0)] # => [0, 2, 4, 6, 8]
تُرجع any(condition) وall(condition) قيمة منطقية تدل على ما إذا كان أيٌّ من عناصر المصفوفة يجتاز الشرط أو كلها تجتازه.
[1, 2, 3, 4] | any(. > 4) # false
[1, 2, 3, 4] | any(. >= 4) # true
[1, 2, 3, 4] | all(. >= 4) # false
[1, 2, 3, 4] | all(. <= 4) # true
يمكننا التحقق من أن مصفوفة تحتوي على عنصر باستخدام index.
تُرجع هذه الدالة فهرس العنصر المعطى إذا كان في المصفوفة،
وإلا تُرجع null.
["carrots", "beef", "potatoes"] | index("beef") # => 1
["carrots", "beef", "potatoes"] | index("bees") # => null
وهناك دالة عكسية تُسمى IN (نعم، بحروف كبيرة).
والمشكلة في IN أن وسيطها ليس مصفوفة بل تدفق.
"beef" | IN(["carrots", "beef", "potatoes"][]) # => true
"bees" | IN(["carrots", "beef", "potatoes"][]) # => false
تمتلك Ruby طريقة each_with_index العملية التي تقرن قيمة العنصر بفهرسه.
وتمتلك Python الدالة enumerate.
ولدى jq دالة مشابهة تُسمى to_entries،
وهي تحوّل المصفوفة إلى مصفوفة من كائنات {key: index, value: value}.
[11, 22, 33, 44] | to_entries
# => [{key: 0, value: 11}, {key: 1, value: 22}, {key: 2, value: 33}, {key: 3, value: 44}]
sort وsort_by
group_by
min وmax وmin_by وmax_by
unique وunique_by
flatten