js 指定删除数组(树结构数据)

查找相同ID删除对象,ID相同则删除该对象
var data =[{id:1,name:'一级', children:[{id:2,name:'二级', children:[{id:3,name:'一级', children:[{id:31,name:'二级'},{id:32,name:'二级'},{id:33,name:'二级'}],company_id:7}],company_id:8}], company_id:9}]
比如ID==31,得到以下数组
[{id:1,name:'一级', children:[{id:2,name:'二级', children:[{id:3,name:'一级', children:[{id:32,name:'二级'},{id:33,name:'二级'}],company_id:7}],company_id:8}], company_id:9}]

阅读 5.7k
3 个回答
function filter (data, id) {
  var newData = data.filter(x => x.id !== id)
  newData.forEach(x => x.children && (x.children = filter(x.children, id)))
  return newData
}

如以下代码所示:

var data = [{
  id: 1,
  name: '一级',
  children: [{
    id: 2,
    name: '二级',
    children: [{
      id: 3,
      name: '一级',
      children: [{
        id: 31,
        name: '二级'
      }, {
        id: 32,
        name: '二级'
      }, {
        id: 33,
        name: '二级'
      }], company_id: 7
    }], company_id: 8
  }], company_id: 9
}]

function filter(arr, id) {
  for (var i = 0; i < arr.length; i++) {
    var el = arr[i]
    if (el.id === id) {
      arr.splice(i, 1)
    } else {
      if (el.children && el.children.length) {
        filter(el.children, id)
      }
    }
  }
  return arr
}

filter(data, 31)

看你数据格式不是很清晰,建议把代码格式化一下。

var data = [{
    id: 1,
    name: '一级',
    children: [{
        id: 2,
        name: '二级',
        children: [{
            id: 3,
            name: '一级',
            children: [{
                id: 31,
                name: '二级'
            },
            {
                id: 32,
                name: '二级'
            },
            {
                id: 33,
                name: '二级'
            }],
            company_id: 7
        }],
        company_id: 8
    }],
    company_id: 9
}]

格式化后,如上所述。
主要是递归函数的思路。

  1. filter(data,31)先遍历第一层数组,如果传入的参数31跟第一层查到的id相同,则直接删除;如果不相同,则继续遍历
  2. 如果有children,则继续遍历该children数组,执行递归操作,filter(item.children,31),继续走第一步,一直判断,直到没有children,最后return出处理过后的新的data对象
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题