Home > Enterprise >  JavaScript deletes a single item of data from a multidimensional array
JavaScript deletes a single item of data from a multidimensional array

Time:01-27

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"));
  •  Tags:  
  • Related