2016-02-21 12 views
8

Aşağıdaki dizi var:JQ sıralama birden fazla anahtarla tarafından inen

: o yüzden bu sonucu

[{ 
    "name": "Object 1", 
    "prop1": 5, 
    "prop2": 2 
}, { 
    "name": "Object 2", 
    "prop1": 6, 
    "prop2": 4 
}, { 
    "name": "Object 3", 
    "prop1": 5, 
    "prop2": 3 
}] 

Bu SQL benzer bu diziyi sıralamak istiyorum "prop1 DESC SİPARİŞ, prop2 ASC" var

[{ 
    "name": "Object 2", 
    "prop1": 6, 
    "prop2": 4 
}, { 
    "name": "Object 1", 
    "prop1": 5, 
    "prop2": 2 
}, { 
    "name": "Object 3", 
    "prop1": 5, 
    "prop2": 3 
}] 

Bir diziyi a) bir anahtarla azalan ve b) birden çok tuş ile nasıl sıralayabilirim?

Sürüm: JQ olarak 1.5

cevap

8

JQ, sırayla içerdikleri elemanları, sınıflandırma ile diziler sıralama. Yani:

$ jq -n '[1, 2] < [1, 3], [1, 2] < [2, 1]' 
true 
true 

sort_by filtre dizisinin her bir elemanı için değerlendirilecektir bağımsız değişken olarak bir ifade alarak, bir dizi sıralar. Örneğin, uzunluğu kelimelerin bir listesini sıralamak istedim:

argüman olarak sort_by verilen ifade birden fazla değer döndürürse, dönüş değerleri örtülü, bir dizideki bürünecek
$ jq -n '["prop", "leo", "column", "blast"] | sort_by(length)' 
[ 
    "leo", 
    "prop", 
    "blast", 
    "column" 
] 

olacak Yukarıda belirtilen dizi sıralama kurallarına tabidir. Örneğin, sonra alfabetik uzunluğuna göre kelimelerin bir listesini sıralamak ve isteseydiniz:

$ jq -n '["pro", "leo", "column", "ablast"] | sort_by(length, .)' 
[ 
    "leo", 
    "pro", 
    "ablast", 
    "column" 
] 

Bunu bilen ve dikkate alarak sizin örnekte değerleri sayısal olduklarını aşağıdakileri yapmanız sadece edebilirsiniz:

$ jq 'sort_by(-.prop1, .prop2)'