过滤 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);
})
})
我想过滤 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);
})
})