arrays - JQ:将对象数组减少为对象,添加到数组

标签 arrays json addition jq

我有一个更复杂的 JQ 表达式来处理对象数组。

输入如下所示:

[
    { "key": "1", "value": "value 1"},
    { "key": "2", "value": "value 2"},
    { "key": "1", "value": "value 3"},
]

我想要得到的是这样的:

{
    "1": { "values": ["value 1", "value 3"] },
    "2": { "values": ["value 2"] }
}

或者,对于我的用例:

{
    "1": [ "value 1", "value 3" ],
    "2": [ "value 2" ]
}

也可以。

我已经尝试使用... | { (.key): [.value] } 但结果是(对我来说并不奇怪)后来出现的键只会覆盖已经存在的键。我想要完成的是“创建一个新的键/值对或将 .value 添加到现有的“值”数组中”。

最佳答案

依赖group_by的解决方案的缺点是group_by需要排序,这在这里是不必要的。在此响应中,我将展示如何通过使用通用(且通常有用)的 jq 函数来避免任何排序,该函数“融合”JSON 对象数组,本质上是将每个键的值弹出到数组中,然后连接相应的值数组。

# input should be an array of objects
def meld:
  reduce .[] as $o
    ({}; reduce ($o|keys)[] as $key (.; .[$key] += [$o[$key]] ));

我们还定义一些数据:

def data:
[
    { "key": "1", "value": "value 1"},
    { "key": "2", "value": "value 2"},
    { "key": "1", "value": "value 3"}
]
;

然后是过滤器:

data |  map([.] | from_entries) | meld

产生:

{"1":["value 1","value 3"],"2":["value 2"]}

关于arrays - JQ:将对象数组减少为对象,添加到数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39994652/

相关文章:

javascript - JSON.parse 和 JSON.stringify 将长整数处理为字符串

python - 将 AttributeError : 'list' object has no attribute 'split' while converting the . 日志文件格式化为 .json 格式

javascript - 我如何通过 angularJS 中的嵌套键值对正确地重复 ng-repeat

javascript - 不寻常的 JavaScript 加法与串联行为

iphone - 在 Xcode 中添加新模板

arrays - 3D 数组中的按维度逻辑索引

c - 数组在主函数内和主函数外的行为不同?

C# 在 Arraylist 中使用 array.Where

java - Java 中的二维 char 数组创建/初始化

Java加减法用钱