【问题标题】:Filtering array of nested objects in JavaScript up to 'n' levels在 JavaScript 中过滤嵌套对象数组,最高可达“n”级
【发布时间】:2021-11-18 14:36:49
【问题描述】:

我想过滤 javascript 中的嵌套对象数组。

我从其他question得到以下答案。

var sampleData= [{       
        "rowId": "3.0.0",
        "startDate": "2020-10-20",
        "subTasks": [                 
            {                
                "rowId": "3.3.0",
                "startDate": "2021-05-26",             
                "subTasks": [
                    {
                        "rowId": "3.3.0.1",
                        "startDate": "2021-05-26",                        
                        "subTasks": []
                    },
                    {
                        "rowId": "3.3.0.2",
                        "startDate": "2021-06-09",
                        "endDate": "2021-07-23",  
                        "subTasks": []                      
                    },                   
                ]
            },           
        ]
    }]

    filtered = sampleData.map(element => {
        return {
          ...element,
          subTasks: element.subTasks.filter(subElement => {
            return subElement.endDate
          })
        }
      })
      console.log("sampleData",JSON.stringify(filtered))




我想根据结束日期进行申报。 预期输出:需要过滤 rowId 为“3.3.0.2”的对象。

此代码最多只能过滤 2 个级别。但在我的例子中,嵌套对象可以增长到 10 个级别。如何过滤最多 n 级的对象数组?

【问题讨论】:

    标签: javascript arrays filter underscore.js


    【解决方案1】:

    您可以使用递归函数并仅遍历有效的子任务。我认为不需要太多解释,假设您知道什么是递归函数(我猜您知道):

    function recurseOnSubTasks(elem) {
      const filteredSubTasks = elem.subTasks
        .filter(subTask => !subTask.endDate)
        .map(subTask => recurseOnSubTasks(subTask))
      
      return {
        ...elem,
        subTasks: filteredSubTasks
      }
    }
    

    然后调用它:

    sampleData.map(elem => recurseOnSubTasks(elem))
    

    var sampleData= [{       
            "rowId": "3.0.0",
            "startDate": "2020-10-20",
            "subTasks": [                 
                {                
                    "rowId": "3.3.0",
                    "startDate": "2021-05-26",             
                    "subTasks": [
                        {
                            "rowId": "3.3.0.1",
                            "startDate": "2021-05-26",                        
                            "subTasks": []
                        },
                        {
                            "rowId": "3.3.0.2",
                            "startDate": "2021-06-09",
                            "endDate": "2021-07-23",  
                            "subTasks": []                      
                        },                   
                    ]
                },           
            ]
        }];
    
    function recurseOnSubTasks(elem) {
        const filteredSubTasks = elem.subTasks
        .filter(subTask => !subTask.endDate)
        .map(subTask => recurseOnSubTasks(subTask))
      
      return {
        ...elem,
        subTasks: filteredSubTasks
      }
    }
    
    console.log(sampleData.map(elem => recurseOnSubTasks(elem)));

    【讨论】:

      【解决方案2】:

      您可以通过使用递归来做到这一点。 values 数组将包含所有任务,然后您可以对所需的任何属性进行过滤。

      var values = [];
      function GetValues(samples){
      
          if(samples != [] && samples != undefined && samples != null){
              for(var sample of samples){       
                  values.push(sample)
                  GetValues(sample.subTasks)
                                        }
      
          }else{
              return {};
          }
      
      }
      GetValues(sampleData)
      

      【讨论】:

        【解决方案3】:

        如果要根据 endDate 进行过滤,则可以使用 forEach 方法并将其放入对象中,然后到达所需的输出。希望这会奏效。

           var sampleData= [{       
                "rowId": "3.0.0",
                "startDate": "2020-10-20",
                "subTasks": [                 
                    {                
                        "rowId": "3.3.0",
                        "startDate": "2021-05-26",             
                        "subTasks": [
                            {
                                "rowId": "3.3.0.1",
                                "startDate": "2021-05-26",                        
                                "subTasks": []
                            },
                            {
                                "rowId": "3.3.0.2",
                                "startDate": "2021-06-09",
                                "endDate": "2021-07-23",  
                                "subTasks": []                      
                            },                   
                        ]
                    },           
                ]
        }]
        
          sampleData.forEach((obj)=> {
               obj.subTasks.forEach((prop) => {
                   const newObj = {name: prop};
                   console.log(newObj.name.subTasks[1]);
                   console.log(newObj.name.subTasks[1].endDate);
               })
            })
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-11-07
          • 2019-10-15
          • 1970-01-01
          • 2022-11-14
          • 1970-01-01
          • 1970-01-01
          • 2021-01-15
          • 1970-01-01
          相关资源
          最近更新 更多