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 থেকে শুরু করে 5টি এলিমেন্ট রিটার্ন করে; শেষ ইনডেক্সটি অন্তর্ভুক্ত নয়।
কয়েকটি সুবিধাজনক ফাংশন আছে:
first প্রথম এলিমেন্টটি দেয়।last শেষ এলিমেন্টটি দেয়।nth(n) ইনডেক্স n-এ থাকা এলিমেন্টটি দেয়।কমন ইটারেশনের কাজগুলো সামলানোর জন্য 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
আপনি একজন আগ্রহী পাখি-পর্যবেক্ষক, যিনি গত সাত দিনে আপনার বাগানে কত পাখি এসেছে তার হিসাব রাখেন।
আপনার পাঁচটি কাজ আছে, যার সবই আপনার বাগানে আসা পাখির সংখ্যা নিয়ে।
আপনি আপনার পাখির হিসাবগুলো JSON ফরম্যাটে রাখেন। একটি "main" অ্যারে সাপ্তাহিক হিসাবের অ্যারেগুলো ধারণ করে। প্রতিটি সাপ্তাহিক হিসাব সাতটি ইন্টিজারের একটি অ্যারে, সপ্তাহের প্রতিটি দিনের জন্য একটি সংখ্যা। আপনি সবসময় নতুন সপ্তাহগুলো main অ্যারের শেষে যোগ করেন। গত সপ্তাহের হিসাবগুলো রিটার্ন করে এমন ফিল্টারটি ইমপ্লিমেন্ট করুন।
$ cat bird-counting-data.json
[
...,
[0, 2, 5, 3, 7, 8, 4],
[4, 5, 9, 10, 9, 4, 3]
]
$ jq -f bird-count.jq < bird-counting-data.json
{
"last_week": [0, 2, 5, 3, 7, 8, 4],
...
গতকাল আপনার বাগানে কত পাখি এসেছে তা রিটার্ন করার ফিল্টারটি ইমপ্লিমেন্ট করুন। পাখির হিসাবগুলো দিন অনুসারে সাজানো, যেখানে প্রথম এলিমেন্টটি সবচেয়ে পুরনো দিনের হিসাব আর শেষ এলিমেন্টটি আজকের হিসাব।
$ jq -f bird-count.jq < bird-counting-data.json
{
...
"yesterday": 4,
...
এই সপ্তাহে আপনার বাগানে যত পাখি এসেছে তার মোট সংখ্যা রিটার্ন করার ফিল্টারটি ইমপ্লিমেন্ট করুন।
$ jq -f bird-count.jq < bird-counting-data.json
{
...
"total": 44,
...
কিছু দিন অন্যদের চেয়ে বেশি ব্যস্ত থাকে। ব্যস্ত দিন মানে এমন একটি দিন, যেদিন আপনার বাগানে পাঁচটি বা তার বেশি পাখি এসেছে। এই সপ্তাহের ব্যস্ত দিনের সংখ্যা রিটার্ন করার ফিল্টারটি ইমপ্লিমেন্ট করুন।
$ jq -f bird-count.jq < bird-counting-data.json
{
...
"busy_days": 4,
...
এমন ফিল্টারটি ইমপ্লিমেন্ট করুন যা true রিটার্ন করে, যদি এই সপ্তাহে এমন কোনো দিন থাকে যখন বাগানে শূন্য পাখি এসেছে; অন্যথায় false রিটার্ন করে।
$ jq -f bird-count.jq < bird-counting-data.json
{
...
"has_day_without_birds": false
}
Exercism-এ সাইন আপ করুন, jq ট্র্যাকের 12টি কনসেপ্ট75টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।