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] ইনডেক্স ১০ থেকে শুরু করে ৫টি এলিমেন্ট রিটার্ন করে; শেষ ইনডেক্সটি এর মধ্যে ধরা হয় না।
এমন কিছু সুবিধাজনক ফাংশনও আছে:
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