Το 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] επιστρέφει 5 στοιχεία ξεκινώντας από τη θέση 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) επιστρέφουν μια τιμή 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
Μπορούμε να ελέγξουμε αν ένας πίνακας περιέχει ένα στοιχείο με τη συνάρτηση 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