【问题标题】:Check for duplicate values for a specific JSON key检查特定 JSON 键的重复值
【发布时间】:2018-12-31 15:51:15
【问题描述】:

我在容器中存储了以下 JSON 记录

    {"memberId":"123","city":"New York"}
    {"memberId":"234","city":"Chicago"}
    {"memberId":"345","city":"San Francisco"}
    {"memberId":"123","city":"New York"}
    {"memberId":"345","city":"San Francisco"}

我正在检查是否有任何重复的 memberId - 理想情况下返回 true/false,然后还返回重复的值。

期望的输出:

true
123
345

【问题讨论】:

  • 你能给出你的代码吗?出了什么问题?
  • 请遵循minimal reproducible example 指南 - 具体来说,您期望什么输出格式?
  • 感谢您的反馈。我确实添加了一个示例输出

标签: json parsing duplicates jq


【解决方案1】:

这是使用inputs 的有效方法。它需要使用 -n 命令行选项调用 jq。这个想法是创建一个字典来记录每个 memberId 字符串值。

字典可以按如下方式创建:

reduce (inputs|.memberId|tostring) as $id ({}; .[$id] += 1)

因此,要生成一个真/假指示符,然后是重复项(如果有),您可以这样写:

reduce (inputs|.memberId|tostring) as $id ({}; .[$id] += 1)
| to_entries
| map(select(.value > 1))
| (length > 0), .[].key

(如果已知所有的 .memberId 值都是字符串,那么当然可以放弃对 tostring 的调用。相反,如果 .memberId 既是字符串又是整数值,则上述程序不会区分例如,在 1"1" 的出现之间。)

上述字典有时被称为“词袋”(https://en.wikipedia.org/wiki/Bag-of-words_model)。这导致了泛型函数:

def bow(stream): 
  reduce stream as $word ({}; .[($word|tostring)] += 1);

现在可以更简洁地编写解决方案:

bow(inputs.memberId)
| to_entries
| map(select(.value > 1))
| (length > 0), .[].key

对于有重复的值,可以编写更有效的查询:

bow(inputs.memberId)
| keys_unsorted[] as $k
| select(.[$k] > 1)
| $k

【讨论】:

    猜你喜欢
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 2014-08-21
    相关资源
    最近更新 更多