Διαδρομές
/
jq
jq
/
Ύλη
/
Πίνακες
Πί

Πίνακες σε jq

5 ασκήσεις

Σχετικά με την έννοια Πίνακες

Το 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

Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα

Μάθε την έννοια Πίνακες

Η εξάσκηση είναι κλειδωμένη

Ξεκλείδωσε 8 ακόμη ασκήσεις για να εξασκηθείς στην έννοια Πίνακες