Arrays are not fixed, so I think we need to use recursion. Here's the array and my solution :Not implemented yet. Remove all data where ‘tag’ = 'user'
An array of
var arr = [
{
"name": "ORG_1",
"tag": "org",
"children": [
{
"name": "ORG_1-1",
"tag": "org",
"children": [
{ "name": "USER_1-1-1", "tag": "user" },
{ "name": "USER_1-1-2", "tag": "user" }
]
},
{ "name": "ORG_1-2", "tag": "org", "children": [] },
{ "name": "USER_1-3", "tag": "user" },
{ "name": "USER_1-4", "tag": "user" }
]
},
{
"name": "ORG_2",
"tag": "org",
"children": [
{
"name": "ORG_2-1",
"tag": "org",
"children": [
{ "name": "USER_2-1-1", "tag": "user" },
{ "name": "USER_2-1-2", "tag": "user" }
]
},
{ "name": "ORG_2-2", "tag": "org", "children": [] },
{ "name": "USER_2-3", "tag": "user" },
{ "name": "USER_2-4", "tag": "user" }
]
}
]
I want to delete the object in the array whose 'type' is 'user'. Here is my code
Code 1
const fun1 = treeList => {
treeList.forEach((item, index) => {
item.tag == 'user' && (treeList.splice(index, 1))
item.children.length && fun1(item.children)
})
}
fun1(arr)
Code 2
const fun2 = treeList => {
treeList = treeList.filter(({ tag }) => tag === 'org')
treeList.forEach((item) => {
item.children.length && fun2(item.children)
})
}
fun2(arr)
This is what I expected, Remove all data where ‘tag’ = 'user'
[
{
"name": "ORG_1",
"tag": "org",
"children": [
{
"name": "ORG_1-1",
"tag": "org",
"children": []
},
{ "name": "ORG_1-2", "tag": "org", "children": [] }
]
},
{
"name": "ORG_2",
"tag": "org",
"children": [
{
"name": "ORG_2-1",
"tag": "org",
"children": []
},
{ "name": "ORG_2-2", "tag": "org", "children": [] }
]
}
]
CodePudding user response:
You can create a function called removeUsers, where you can .map() your array of data, for each object that you map, you can create a new object that contains all the keys from the currently iterated object, along with a new children key that is added only if the currently mapped object has a children key. The value of that children key is a filtered version of the current children array, that removes the objects where the tag is user. You can pass this filtered array of objects into a recursive call to removeUsers to remove the users within those objects' children arrays:
const arr = [ { "name": "ORG_1", "tag": "org", "children": [ { "name": "ORG_1-1", "tag": "org", "children": [ { "name": "USER_1-1-1", "tag": "user" }, { "name": "USER_1-1-2", "tag": "user" } ] }, { "name": "ORG_1-2", "tag": "org", "children": [] }, { "name": "USER_1-3", "tag": "user" }, { "name": "USER_1-4", "tag": "user" } ] }, { "name": "ORG_2", "tag": "org", "children": [ { "name": "ORG_2-1", "tag": "org", "children": [ { "name": "USER_2-1-1", "tag": "user" }, { "name": "USER_2-1-2", "tag": "user" } ] }, { "name": "ORG_2-2", "tag": "org", "children": [] }, { "name": "USER_2-3", "tag": "user" }, { "name": "USER_2-4", "tag": "user" } ] } ];
const removeUsers = arr => arr.map((obj) => ({
...obj,
...(obj.children && {children: removeUsers(obj.children.filter(obj => obj.tag !== "user"))})
}));
console.log(removeUsers(arr));
CodePudding user response:
const filterByTag = (arr, tag) => {
return arr.reduce((acc, item) =>
item.tag !== tag && item.children
? [...acc, { ...item, children: filterByTag(item.children, tag) }]
: acc,
[]);
};
console.log(filterByTag(arr, "user"));
