Как отфильтровать первые объекты по второму уровню вложенности?
Цитата
const data = [
{
name: 'dir1',
dir: [
{
name: 'dir1_inner',
dir: []
}
]
},
{
name: 'dir2',
dir: [
{
name: 'dir1_inner',
dir: []
},
{
name: 'dir3_inner',
dir: []
},
{
name: 'dir4_inner',
dir: []
},
]
},
{
name: 'dir3',
dir: [
{
name: 'dir1_inner',
dir: []
},
{
name: 'dir3_inner',
dir: []
}
]
},
]
const allowed = ['dir1', 'dir2', 'dir3']
const allowedInner = ['dir3_inner']
const accesses = []
allowed.map( allow => {
accesses.push(...data.filter(data => !data.name.search(allow) ))
})
console.log(accesses)
в массив accesses должны попасть обЪекты у которых дети равны {name: 'dir3_inner'}
и сами дети должны остаться в виде полного обЪекта с {name: 'dir3_inner'}
data = [
{
name: 'dir2',
dir: [
{
name: 'dir3_inner',
dir: []
}
]
},
{
name: 'dir3',
dir: [
{
name: 'dir3_inner',
dir: []
}
]
}
]
Ответы (2 шт):
Автор решения: Евгений Платов
→ Ссылка
const data = [{
name: 'dir1',
dir: [{
name: 'dir1_inner',
dir: []
}]
},
{
name: 'dir2',
dir: [{
name: 'dir1_inner',
dir: []
},
{
name: 'dir3_inner',
dir: []
},
{
name: 'dir4_inner',
dir: []
},
]
},
{
name: 'dir3',
dir: [{
name: 'dir1_inner',
dir: []
},
{
name: 'dir3_inner',
dir: []
}
]
},
]
const allowed = ['dir1', 'dir2', 'dir3']
const allowedInner = ['dir3_inner']
const accesses = data.reduce((acc, el) => {
const search = el.dir.filter((d) => allowedInner.includes(d.name));
if (search.length > 0) {
acc.push({
name: el.name,
dir: [search]
});
}
return acc
}, []);
console.log(accesses)
Автор решения: Lukas
→ Ссылка
const allowed = ['dir1', 'dir2', 'dir3']
const allowedInner = ['dir3_inner']
const accesses = []
const data = [
{
name: 'dir1',
dir: [
{
name: 'dir1_inner',
dir: []
}
]
},
{
name: 'dir2',
dir: [
{
name: 'dir1_inner',
dir: []
},
{
name: 'dir3_inner',
dir: []
},
{
name: 'dir4_inner',
dir: []
},
]
},
{
name: 'dir3',
dir: [
{
name: 'dir1_inner',
dir: []
},
{
name: 'dir3_inner',
dir: []
}
]
},
];
data.forEach(item => item.dir.some(el => el.name === 'dir3_inner') ? accesses.push(item) : "");
console.log(accesses);