2016-02-21 42 views
8

我有以下阵列:JQ排序多个键降

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

我想排序这个数组类似于此SQL “ORDER BY PROP1 DESC,PROP2 ASC” 让我有这样的结果:

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

如何排序数组a)按键降序和b)使用多个键?

版本:1.5 JQ

回答

8

在JQ,数组排序它们所包含的元素,为了的排序。那就是:

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

sort_by滤波器排序的阵列,以作为参数的表达式,将针对阵列中的每个成员进行评价。例如,如果你想通过长度排序单词列表:

$ jq -n '["prop", "leo", "column", "blast"] | sort_by(length)' 
[ 
    "leo", 
    "prop", 
    "blast", 
    "column" 
] 

如果给予sort_by作为参数表达式返回多于一个值,则返回值将被隐含地包裹在一个阵列中,这将是服从上面提到的阵列排序规则。例如,如果你想通过长排序的单词列表,然后按字母顺序:

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

知道了这一点,并考虑到在你的榜样值是数字,你可以做到以下几点:

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