Το JSON ορίζει έναν πίνακα ως εξής:
Ένας πίνακας είναι μια διατεταγμένη συλλογή τιμών. Ένας πίνακας αρχίζει με
[αριστερή αγκύλη και τελειώνει με]δεξιά αγκύλη. Οι τιμές χωρίζονται με,κόμμα.
Οι πίνακες μπορούν να περιέχουν μηδέν ή περισσότερες τιμές JSON οποιουδήποτε είδους. Τα στοιχεία ενός πίνακα δεν χρειάζεται να είναι όλα του ίδιου τύπου.
Χρησιμοποίησε αγκύλες για να συγκεντρώσεις στοιχεία σε έναν πίνακα.
[1, 2, 3]
Τα στοιχεία ενός stream μπορούν να συλλεχθούν σε έναν πίνακα αν το κλείσεις σε αγκύλες.
range(5) # => a stream of 5 numbers
[range(5)] # => the array [0, 1, 2, 3, 4]
Η συνάρτηση length επιστρέφει τον αριθμό των στοιχείων ενός πίνακα.
Η ευρετηρίαση των πινάκων ξεκινά από το μηδέν.
Μπορείς να ανακτήσεις ένα στοιχείο από έναν πίνακα με μια έκφραση αγκύλης:
το .[2] παίρνει το τρίτο στοιχείο.
Οι αρνητικές θέσεις μετρούν προς τα πίσω από το τέλος του πίνακα:
το .[-1] παίρνει το τελευταίο στοιχείο· το .[-2] είναι το προτελευταίο.
Ένα τμήμα είναι μια υποακολουθία του πίνακα.
Το .[10:15] επιστρέφει 5 στοιχεία ξεκινώντας από τη θέση 10· η τελική θέση δεν περιλαμβάνεται.
Υπάρχουν μερικές βολικές συναρτήσεις:
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 σε ένα stream και συγκέντρωσε τα αποτελέσματα.
[range(10) | select(. % 2 == 0)] # => [0, 2, 4, 6, 8]
Οι any(condition) και all(condition) επιστρέφουν μια τιμή Boolean που δείχνει αν οποιοδήποτε ή όλα τα στοιχεία του πίνακα περνούν τη συνθήκη.
[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" αποθηκεύει πίνακες με τις εβδομαδιαίες μετρήσεις. Κάθε εβδομαδιαία μέτρηση είναι ένας πίνακας με επτά ακέραιους, έναν αριθμό για κάθε ημέρα της εβδομάδας. Προσθέτεις πάντα τις νέες εβδομάδες στο τέλος του κύριου πίνακα. Υλοποίησε το φίλτρο που επιστρέφει τις μετρήσεις της προηγούμενης εβδομάδας.
$ 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 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.