过滤 JavaScript 至 'n' 层的嵌套对象数组

Filtering array of nested objects in JavaScript up to 'n' levels

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

我从其他 那里得到了以下答案。

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 级?

您可以使用递归函数来完成它并只循环有效的子任务。我不认为它需要太多解释,假设你知道递归函数是什么(我猜你知道):

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)));

你可以通过使用递归来做到这一点。 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)

如果你想根据结束日期进行过滤,那么可以使用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);
       })
    })