按jq中的多个键降序排序

Rol*_*der 11 sorting json jq

我有以下数组:

[{
    "name": "Object 1",
    "prop1": 5,
    "prop2": 2
}, {
    "name": "Object 2",
    "prop1": 6,
    "prop2": 4
}, {
    "name": "Object 3",
    "prop1": 5,
    "prop2": 3
}]
Run Code Online (Sandbox Code Playgroud)

我想对这个数组进行排序,类似于这个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
}]
Run Code Online (Sandbox Code Playgroud)

如何对数组进行排序a)按键降序和b)按多个键?

版本:jq 1.5

小智 15

在jq中,数组按顺序排序它们包含的元素.那是:

$ jq -n '[1, 2] < [1, 3], [1, 2] < [2, 1]'
true
true
Run Code Online (Sandbox Code Playgroud)

所述sort_by过滤器进行排序的阵列,以作为参数的表达式,将针对阵列中的每个成员进行评价.例如,如果要按长度对单词列表进行排序:

$ jq -n '["prop", "leo", "column", "blast"] | sort_by(length)'
[
  "leo",
  "prop",
  "blast",
  "column"
]
Run Code Online (Sandbox Code Playgroud)

如果赋予sort_byas参数的表达式返回多个值,则返回值将隐式包装在一个数组中,该数组将受上面提到的数组排序规则的约束.例如,如果要按长度对单词列表进行排序,然后按字母顺序排序:

$ jq -n '["pro", "leo", "column", "ablast"] | sort_by(length, .)'
[
  "leo",
  "pro",
  "ablast",
  "column"
]
Run Code Online (Sandbox Code Playgroud)

了解这一点,并考虑到示例中的值是数字,您可以执行以下操作:

$ jq 'sort_by(-.prop1, .prop2)'
Run Code Online (Sandbox Code Playgroud)

  • 如果prop1不是数字的,则可以使用`explode'这样的`jq'sort_by((。prop1 | explode | map(-。)),.prop2)'` (2认同)

小智 7

可以使用reversejq 1.5 Manual)函数,例如:

\n
$ jq -n \'["pro", "leo", "column", "ablast"] | sort | reverse\'\n[\n  "pro",\n  "leo",\n  "column",\n  "ablast"\n]\n
Run Code Online (Sandbox Code Playgroud)\n

所以你的具体例子可能会变成:

\n
$ jq -n \'[{...}, {...}, {...}, {...}] | sort_by(.prop2) | reverse | sort_by(.prop1) | reverse\'\n[\n  {\n    "name": "Object 2",\n    "prop1": 6,\n    "prop2": 4\n  },\n  {\n    "name": "Object 1",\n    "prop1": 5,\n    "prop2": 2\n  },\n  {\n    "name": "Object 3",\n    "prop1": 5,\n    "prop2": 3\n  }\n]\n
Run Code Online (Sandbox Code Playgroud)\n

SQL ORDER BY prop1 DESC, prop2 ASC\xe2\x86\x92 jq | sort_by(.prop2) | reverse | sort_by(.prop1) | reverse\xe2\x80\x93 注意,排序是用属性以相反的顺序指定的,并且reverse使用了两次。

\n

给定prop1prop2是数字,接受的答案 ( sort_by(-.prop1, .prop2)) 更简单/更好。

\n