【问题标题】:merge array of values without keys合并没有键的值数组
【发布时间】:2020-05-04 12:11:28
【问题描述】:

我有一些奇怪的数据设置,我有以下 json 文件:

文件 1:

[
 ["04-05-2020",
  12
 ],
 ["03-05-2020",
  16
 ]
]

文件 2:

[
 ["04-05-2020",
  50
 ],
 ["03-05-2020",
  70
 ]
]

我想使用日期(未指定为键)合并 2 个 json 文件,并将键和值重新分配给输出,使得输出类似于: 文件 1:

[
 {date: "04-05-2020",
  value1 : 12,
  value2 : 50
 },
 {date: "03-05-2020",
  value1 : 16,
  value2: 70
 }
]

我的想法是我可能必须先将文件合并在一起,然后对数组中的日期进行某种减少操作,但到目前为止我的尝试没有成功。或者也许我应该首先将数组格式化为 Key + Value,然后执行 jq -s 'add'?我实际上不确定如何重新格式化它。

【问题讨论】:

    标签: json jq


    【解决方案1】:

    一种使用reduce的方法:

    reduce inputs[] as [$date, $value] ({};
      if has($date) then
        .[$date] += {value2: $value}
      else
        .[$date] = {$date, value1: $value}
      end
    ) | map(.)
    

    请注意,您需要在命令行中指定-n/--null-input 选项才能使inputs 工作。

    Online demo

    【讨论】:

      【解决方案2】:

      如果 file1.json 和 file2.json 中的数组与您的示例一样,您可以简单地编写:

      .[0] |= map({date: .[0], value1: .[1]})
      | .[1] |= map({date: .[0], value2: .[1]})
      | transpose
      | map(add)
      

      使用类似的调用:

      jq -s -f program.jq file1.json file2.json
      

      当然有很多变化。

      【讨论】:

        猜你喜欢
        • 2014-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-25
        • 2016-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多