I am trying to remove items from a nested array based on an array of correct matches.
Three requirements apply:
- The depth of the array is unknown. Items can have nested children.
- Only items without children should be removed
- The items should be removed if they are not in the matching array
I have build a function to recursively get to the deepest level and filter the items based on the $match array.
This is what my code looks like so far:
import * as lodash from "https://cdn.skypack.dev/[email protected]";
let filterRecursively = (arr, match) => {
// Recursively go to the deepest array we can find
arr.forEach(el => {
arr = el.children ? filterRecursively(el.children, match) : arr
});
// If we are at the deepest level we filter the items ...
if (arr[0] && arr[0].children === undefined) {
return _.filter(arr, (item) => {
return match.includes(item.name)
})
} else { // ... if not we just return the array as-is
return arr
}
}
let arr = [
{
'name': 'John',
'children': [
{
'name': 'John',
'children': [
{ 'name': 'John' },
{ 'name': 'Jane' },
{ 'name': 'Joe' }
]
}]
}, {
'name': 'Jeff',
'children': [
{
'name': 'Joe',
'children': [
{ 'name': 'Jill' },
{ 'name': 'Jeff' },
{ 'name': 'Joe' }
]
}]
}];
let match = ['John', 'Joe'];
let result = filterRecursively(arr, match);
console.log(result);
// Expected result:
[
{
'name': 'John',
'children': [
{
'name': 'John',
'children': [
{ 'name': 'John' },
{ 'name': 'Joe' }
]
}]
}, {
'name': 'Jeff',
'children': [
{
'name': 'Joe',
'children': [
{ 'name': 'Joe' }
]
}]
}];
// Current output
[
{
"name": "Joe"
}
]
[{name: 'Jane', children: [{name: 'Jane'}]}]should the outermost Jane also be removed, since after processing the inner one, it will have no remaining children? Also, please see How do I create a runnable stack snippet?