我有一个对象数组。每个对象包含另一个数组。
如何通过嵌套aParticipants
数组的sFullName
的值过滤aParticipants
数组?
const filterString = '';
const aParticipants = [{
'iRoleId': 1,
'aParticipants': [{
'iId': 1,
'sFullName': 'Jimmy'
}]
},
{
'iRoleId': 2,
'aParticipants': [{
'iId': 2,
'sFullName': 'Tomas'
},
{
'iId': 3,
'sFullName': 'Stanley'
}
]
}
]
我尝试过这种方法:
const aFilteredParticipants = [...aParticipants].filter(employeeBlock => {
employeeBlock.aParticipants = employeeBlock.aParticipants.filter( item =>
{
return item.sFullName.toLowerCase().includes(filterString.toLowerCase());
});
return employeesBlock.aParticipants.length;
}
在这里,我通过过滤嵌套数组后剩余的长度来过滤父数组。然后通过检查字段sFullName
中是否包含filterString
来过滤嵌套数组。
第一次过滤后输出正确。但是在首先过滤父数组aParticipants
的对象中的嵌套数组aParticipants
之后,将其值更改为[]
空数组。
虽然我正在使用传播算子复制初始数组。
答案 0 :(得分:0)
const aFilteredParticipants = [... aParticipants] .filter(employeeBlock
您不需要[...aParticipants]
aParticipants 已经是一个数组,因此不会有任何区别。
您可以使用以下
const filterString = 'Jimmy';
const aParticipants = [{
'iRoleId': 1,
'aParticipants': [{
'iId': 1,
'sFullName': 'Jimmy'
}]
},
{
'iRoleId': 2,
'aParticipants': [{
'iId': 2,
'sFullName': 'Tomas'
},
{
'iId': 3,
'sFullName': 'Stanley'
}
]
}
]
filteredParticipants = aParticipants.filter( x => {
var isValid = false;
[].concat(x.aParticipants).some(z => {
if (z.sFullName.toLowerCase().indexOf(filterString.toLowerCase()) !== -1) {
isValid = true;
}
return isValid;
})
return isValid;
})
console.log(filteredParticipants)
答案 1 :(得分:0)
const filterString = '';
const aParticipants = [{
'iRoleId': 1,
'aParticipants': [{
'iId': 1,
'sFullName': 'Jimmy'
}]
},
{
'iRoleId': 2,
'aParticipants': [{
'iId': 2,
'sFullName': 'Tomas'
},
{
'iId': 3,
'sFullName': 'Stanley'
}
]
}
]
// here we are checking that a sFullName contains our filter
const fullNameContains = filter => participant =>
participant.sFullName.toLowerCase().includes(filter.toLowerCase())
// here we verify that at least one of the aParticipants sub array contains the filter
const hasFullNames = filter => employeeBlock =>
employeeBlock.aParticipants.some(fullNameContains(filterString))
// here we filter participants
const aFilteredParticipants = aParticipants.filter(hasFullNames(filterString))
console.log('aFilteredParticipants', aFilteredParticipants);