我尝试从匹配属性值(titleB2)的数组中筛选出孔对象(objB)。
const array = [
{
name: 'objA',
subArray: []
}, {
name: 'objB',
subArray: [
{
title: 'titleB'
}, {
title: 'titleB2'
}, {
title: 'titleB3'
}
]
}, {
name: 'objC',
subArray: [
{
title: 'titleC'
}, {
title: 'titleC2'
}, {
title: 'titleC3'
}
]
}, {
name: 'objD',
subArray: []
}
]
const filterArray = array.filter(a => a.subArray.length > 0);
console.log(filterArray);
// Output: objB + objC
const resArray = filterArray.filter(a => a.subArray.filter(f => f.title === 'titleB2'));
console.log(resArray);
// Output: objB + objC
我想,我在逻辑上做错了。但是到底是什么?
我需要输出
{
name: 'objB',
subArray: [
{
title: 'titleB'
}, {
title: 'titleB2'
}, {
title: 'titleB3'
}
]
}
我可以想象我错误地使用了过滤器filterArray.filter()
,因为它已经被过滤了吗?但是我这样做是因为在一个数组中有多个数组。好吧,说实话,我不确定。
但是我不明白的是,为什么我可以使用条件a => a.subArray.length > 0?
而不是f => f.title === 'titleB2'
答案 0 :(得分:1)
要在子数组中查找具有特定标题的对象,可以在子数组上使用some()
,如果子数组中的一项符合您的条件(在本例中为标题),则返回true: >
const array = [{name: 'objA',subArray: []}, {name: 'objB',subArray: [{title: 'titleB'}, {title: 'titleB2'}, {title: 'titleB3'}]}, {name: 'objC',subArray: [{title: 'titleC'}, {title: 'titleC2'}, {title: 'titleC3'}]}, {name: 'objD',subArray: []}]
let found = array.filter(item => item.subArray.some(sub => sub.title === 'titleB2'))
console.log(found)
答案 1 :(得分:0)
在子数组上使用some()
代替filter()
。它返回一个布尔值。
const resArray = array.filter(a => a.subArray.some(f => f.title === 'titleB2'));
console.log(resArray);
// Output: objB + objC
<script>
const array = [
{
name: 'objA',
subArray: []
}, {
name: 'objB',
subArray: [
{
title: 'titleB'
}, {
title: 'titleB2'
}, {
title: 'titleB3'
}
]
}, {
name: 'objC',
subArray: [
{
title: 'titleC'
}, {
title: 'titleC2'
}, {
title: 'titleC3'
}
]
}, {
name: 'objD',
subArray: []
}
]
</script>