如何根据嵌套在json中的条件过滤复杂的json?

Posted

技术标签:

【中文标题】如何根据嵌套在json中的条件过滤复杂的json?【英文标题】:How filter complex json on condition nested in json? 【发布时间】:2022-01-19 18:21:09 【问题描述】:

我有一个复杂对象数组,需要根据多个条件进行过滤

var myList= [
  
    "UserId": 1,
    "UserDetails": 
      "Department": [
        
          "Name": "dept1"
        
      ],
      "Projects": [
        
          "Name": "Project1"
        ,
        
          "Name": "Project2"
        
      ]
    
  ,
  
    "UserId": 2,
    "UserDetails": 
      "Department": [
        
          "Name": "dept2"
        
      ],
      "Projects": [
        
          "Name": "Project3"
        ,
        
          "Name": "Project4"
        
      ]
    
  ,
  
    "UserId": 3,
    "UserDetails": 
      "Department": [
        
          "Name": "dept3"
        
      ],
      "Projects": [
        
          "Name": "Project5"
        ,
        
          "Name": "Project6"
        
      ]
    
  
]

我想根据两个条件过滤部门-->名称为“dept3”或存在名称为“Project3”的项目

var filteredElements=this.myList.filter((x)=>x.UserDetails.filter((y)=>y.Department... ??

如何编写代码来过滤这两个条件?

【问题讨论】:

你有一个数据集,你必须过滤它。问题是什么?以及它与打字稿有什么关系? 【参考方案1】:

您不能在UserDetails 上使用过滤器,因为它不是数组而是对象。

DepartmentProjects 上应用 find,并在它们之间使用 OR 条件和所需条件。

var myList= [
    
      "UserId": 1,
      "UserDetails": 
        "Department": [
          
            "Name": "dept1"
          
        ],
        "Projects": [
          
            "Name": "Project1"
          ,
          
            "Name": "Project2"
          
        ]
      
    ,
    
      "UserId": 2,
      "UserDetails": 
        "Department": [
          
            "Name": "dept2"
          
        ],
        "Projects": [
          
            "Name": "Project3"
          ,
          
            "Name": "Project4"
          
        ]
      
    ,
    
      "UserId": 3,
      "UserDetails": 
        "Department": [
          
            "Name": "dept3"
          
        ],
        "Projects": [
          
            "Name": "Project5"
          ,
          
            "Name": "Project6"
          
        ]
      
    
  ]
  
var filteredElements = myList.filter(x =>x.UserDetails.Department.find(d => d.Name == "dept3") || x.UserDetails.Projects.find(p => p.Name == "Project3"))
console.log(filteredElements)

【讨论】:

【参考方案2】:

满足条件

    用户属于部门“dept3”

    user.UserDetails.Department.some(department => department.Name == "dept3")

    有一个名为“Project3”的项目

    user.UserDetails.Projects.some(project => project.Name == "Project3")

现在将它们链接在一起,

var filteredElements = this.myList.filter(user => 
    user.UserDetails.Department.some(department => department.Name == "dept3") || 
    user.UserDetails.Projects.some(project => project.Name == "Project3"))

【讨论】:

您的代码不起作用。 Department 不是对象而是数组。看我的回答。 编辑处理数组,谢谢。【参考方案3】:
myList.filter(i => i.UserDetails.Department.some(d => d.Name === 'dept3') || i.UserDetails.Projects.some(p => p.Name === 'Project3'))

【讨论】:

以上是关于如何根据嵌套在json中的条件过滤复杂的json?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Azure Synapse pyspark 过滤器根据嵌套对象的数据类型展平嵌套的 json 对象

使用嵌套对象迭代 json 并根据属性值进行过滤

如何使用嵌套的 json 对象填充 vue 条件库中的 vue 组件

Spark使用DataFrame读取复杂JSON中的嵌套数组

如何在 Angular 中为嵌套的 JSON 对象使用搜索过滤器?

Ruby 中嵌套复杂对象的自定义 to_json