【问题标题】:Create object from array of keys and values从键和值数组创建对象
【发布时间】:2015-03-22 02:43:22
【问题描述】:

我已经为此苦苦挣扎了几个小时,但似乎无法找到解决方法。我有一个键数组和一个值数组,如何生成一个对象?输入:

[["key1", "key2"], ["val1", "val2"]]

输出:

{"key1": "val1", "key2": "val2"}

【问题讨论】:

    标签: arrays json object transpose jq


    【解决方案1】:

    github 上解决了这个问题:

    .[0] as $keys |
    .[1] as $values |
    reduce range(0; $keys|length) as $i  ( {}; . + { ($keys[$i]): $values[$i] })
    

    【讨论】:

      【解决方案2】:

      当前版本的 jq 有一个 transpose 过滤器,可用于配对键和值。您可以使用它来轻松构建结果对象。

      transpose | reduce .[] as $pair ({}; .[$pair[0]] = $pair[1])
      

      【讨论】:

      • 谢谢杰夫,不过我不确定这是否有效。我玩弄了它,第一部分似乎生成了每个键/值组合,但是 from_entries 似乎用错误的键/值对覆盖了正确的键/值对。这就是我得到的:{ "key1": "val2", "key2": "val2" }
      • 哎呀,我知道交叉产品可能是个问题。当我检查它时,我认为它很好。太糟糕了,没有内置的zip 过滤器。那么这将是微不足道的。
      • 不需要使用from_entries。即:转置|地图({ (.[0]): .[1] }) |添加
      【解决方案3】:

      要明确一点:

      (0) Abdullah Jibaly的解决方案简单、直接、高效、通用,应该适用于所有版本的jq;

      (1) transpose/0 是 jq 1.5 中的内置函数,自 2014 年 10 月起在预发布版本中可用;

      (2) 使用 transpose/0(或上面定义的 zip/0),一个更短但仍然简单、快速和通用的问题解决方案是:

      transpose | map( {(.[0]): .[1]} ) | add
      

      例子:

      $ jq 'transpose | map( {(.[0]): .[1]} ) | add'
      

      输入:

      [["k1","k2","k3"], [1,2,3] ]
      

      输出:

      {
        "k1": 1,
        "k2": 2,
        "k3": 3
      }
      

      【讨论】:

        【解决方案4】:

        从头开始,它实际上不适用于任何大于 2 的数组。

        [map(.[0]) , map(.[1])] | map({(.[0]):.[1]}) | add

        Welp,我认为这很容易,有一点 prolog 经验......哦,伙计。最后我也把头撞到了墙上。不要以为我会再用 jq。

        【讨论】:

        • 感谢您的努力!我实际上找到了答案(请参阅更新后的 Q)。
        • 如果我们内置了一些比较典型的函数式方法,比如zip,其实还不错。幸运的是,实现它还不错。
        【解决方案5】:

        这是一个解决方案,它使用 reduce 和一个包含迭代索引的状态对象和一个结果对象。它遍历.[0]中的键,在.[1]的结果中设置相应的值

          .[1] as $v
        | reduce .[0][] as $k (
           {idx:0, result:{}}; .result[$k] = $v[.idx] | .idx += 1
          )
        | .result
        

        【讨论】:

          猜你喜欢
          • 2016-12-31
          • 1970-01-01
          • 2013-12-02
          • 1970-01-01
          • 1970-01-01
          • 2015-03-05
          • 2019-09-09
          相关资源
          最近更新 更多