如何避免在构造对象时生成所选数据的所有组合? [英] How to avoid generating all combinations of selected data while constructing an object?

查看:14
本文介绍了如何避免在构造对象时生成所选数据的所有组合?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的原始 JSON 如下所示.

My original JSON is given below.

[
  {
    "id": "1",
    "name": "AA_1",
    "total": "100002",
    "files": [
      {
        "filename": "8665b987ab48511eda9e458046fbc42e.csv",
        "filename_original": "some.csv",
        "status": "3",
        "total": "100002",
        "time": "2020-08-24 23:25:49"
      }
    ],
    "status": "3",
    "created": "2020-08-24 23:25:49",
    "filenames": "8665b987ab48511eda9e458046fbc42e.csv",
    "is_append": "0",
    "is_deleted": "0",
    "comment": null
  },
  {
    "id": "4",
    "name": "AA_2",
    "total": "43806503",
    "files": [
      {
        "filename": "1b4812fe634938928953dd40db1f70b2.csv",
        "filename_original": "other.csv",
        "status": "3",
        "total": "21903252",
        "time": "2020-08-24 23:33:43"
      },
      {
        "filename": "63ab85fef2412ce80ae8bd018497d8bf.csv",
        "filename_original": "some.csv",
        "status": "2",
        "total": 0,
        "time": "2020-08-24 23:29:30"
      }
    ],
    "status": "2",
    "created": "2020-08-24 23:35:51",
    "filenames": "1b4812fe634938928953dd40db1f70b2.csv&&63ab85fef2412ce80ae8bd018497d8bf.csv",
    "is_append": "0",
    "is_deleted": "0",
    "comment": null
  }
]

从这个 JSON 中,我想通过组合具有 status: 2 的对象的字段及其也具有相同对 status 的 files 的字段来创建新对象: 2.

From this JSON I want to create new objects by combining fields from objects which have status: 2 and their files which also have the same pair, status: 2.

所以,我期待一个如下的 JSON 数组.

So, I am expecting a JSON array as below.

[
  {
    "id": "4",
    "name": "AA_2",
    "file_filename": "63ab85fef2412ce80ae8bd018497d8bf.csv",
    "file_status": 2
  }
]

到目前为止,我尝试过使用这个 JQ 过滤器:

So far I tried with this JQ filter:

.[]|select(.status=="2")|[{id:.id,file_filename:.files[].filename,file_status:.files[].status}]

但这会产生一些无效数据.

But this produces some invalid data.

[
  {
    "id": "4", # want to remove this as file.status != 2
    "file_filename": "1b4812fe634938928953dd40db1f70b2.csv",
    "file_status": "3"
  },
  {
    "id": "4",
    "file_filename": "1b4812fe634938928953dd40db1f70b2.csv",
    "file_status": "2"
  },
  {
    "id": "4", # Repeat
    "file_filename": "63ab85fef2412ce80ae8bd018497d8bf.csv",
    "file_status": "3"
  },
  {
    "id": "4",  # Repeat
    "file_filename": "63ab85fef2412ce80ae8bd018497d8bf.csv",
    "file_status": "2"
  }
]

如何使用 JQ 过滤新的 JSON 并删除这些重复的对象?

How do I filter the new JSON using JQ and remove these duplicate objects?

推荐答案

通过将 [] 运算符应用于 files 两次,您会遇到组合爆炸.这需要避免,例如:

By applying [] operator to files twice, you're running into a combinatorial explosion. That needs to be avoided, for example:

[ .[] | select(.status == "2") | {id, name} + (.files[] | select(.status == "2") | {file_filename: .filename, file_status: .status}) ]

在线演示

这篇关于如何避免在构造对象时生成所选数据的所有组合?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆