【问题标题】:Feature request? Ability to create an object via an array of key names in jq功能要求?能够通过 jq 中的键名数组创建对象
【发布时间】:2019-07-26 15:29:30
【问题描述】:

我是 jq 1.5 和 1.6 的中高级用户。我正在迭代一个对象数组(比如说,以前十位数字的名称为键)。我有一个字符串数组存储在变量 $odd_fields (["one","three",...,"nine"]) 中。不使用复杂的迭代过程(因为我可以只用 map({one,three,...,nine}) 静态地做到这一点,我希望能够将我的对象数组重新转换为对象数组参考我的键数组,并按此顺序,如 map({$odd_fields[]})。

经过数百次尝试,如果没有静态成员列表,我似乎无法一次性完成。我已经能够通过创建一个不需要的键数组和映射 del($unwanted_keys[]) 来近似这个,但我不在乎我扔掉了什么键(我没有信心第 50 个对象没有一个我不想要的额外键),只有我想要保留的键(或创建,如果丢失),因此数组中的每个对象都具有相同的任意键(我的键)以相同的顺序(适用于@csv)。

这是一般需要,与特定 JSON glob 或特定键集没有直接关系,因此没有示例 JSON。

大多数不产生语法或引用错误的尝试都会给我一个对象数组 [{"odd_fields":["one","three",...,"nine"]},...],或者,一些迭代过程只给了我想要的键的值。我想要整个一致的子集对象,就好像我列表中没有的任何键都不存在一样。

此外,任何可以告诉我的向导 - 在遍历对象时,有什么方法可以确定“.”的关键是什么?类似于: {"one":1,"two":2,"three":3}|map(.|my_key) (其中函数 my_key 显示 . 的键是什么)。我意识到有一种更简单的方法可以执行上述示例,但我希望能够确定 . 在其他不太直接的代码中的键。我不需要使用它来从对象中提取所有键,只需从任意“。”中提取一个键。

【问题讨论】:

  • 我没有对您的问题投反对票,但除非您按照minimal reproducible example 准则对其进行编辑,否则您可能会获得更多的反对票。即使您的问题很笼统,也很高兴提供相关示例。另外,我建议编辑此 Q 以便它只问一个问题,并按照这些准则单独问你的第二个问题。
  • 您的问题令人困惑,阅读时间过长,格式不合适。请以更好更快的方式提出您的问题,以便我们为您提供帮助。
  • 道歉。长期读者,第一次发帖,我很快就从工作中抽出来了,没有考虑礼仪或简洁。下次我会做得更好。感谢建设性的批评。干杯!

标签: json object key jq


【解决方案1】:

要使用数组中的键和键顺序重铸对象,$array:

def recast($array):
  . as $in
  | reduce $array[] as $k ({}; .[$k] = $in[$k]);

您可以将它与您的数组一起用作输入,如下所示:

map(recast($odd_fields))

您可能希望针对丢失和/或额外的键进行调整。

作为单线

一个紧凑、无减少的版本:

map([$array[] as $p|{($p):.[$p]}]|add)

【讨论】:

  • 这正是我想要的。比我希望的要冗长一些,但不是一个复杂的迭代过程,实际上可以在 map() 中键入以避免函数声明。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-14
  • 2022-11-12
  • 2020-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多