js 树形结构根据条件push新数组

数据结构↓

const data = [{
        name: '水果大全',
        id: '111',      
        isOpen: true            //把111 push进newData
        children: [{
          name: '浆果类',
          id: '112',
          isOpen: true     //把112 push进newData
          children: [{
            name: '草莓',
            id: '113',
            isOpen: true      //把113 push进newData
          }, {
            name: '桑椹',
            id: '114',
            isOpen: true
          }, {
            name: '黑莓',
            id: '115',
            isOpen: false
          }]
        }, {
          name: '柑橘类',
          id: '116',
          isOpen: true
          children: [{
            name: '橘子',
            id: '117',
            isOpen: true
          }, {
            name: '橙子',
            id: '118',
            isOpen: false
          }]
        }]
      }, {
        name: '奥特曼大全',
        id: '119',
        isOpen: true
        children: [{
          name: '昭和类',
          id: '120',
          isOpen: true
          children: [{
            name: '杰克',
            id: '121',
            isOpen: true
          }, {
            name: '泰罗',
            id: '122',
            isOpen: false
          }, {
            name: '艾斯',
            id: '123',
            isOpen: true
          }]
        }, {
          name: '平成类',
          id: '124',
          isOpen: false
          children: [{
            name: '迪迦',
            id: '125',
            isOpen: false
          }, {
            name: '盖亚',
            id: '126',
            isOpen: false
          }]
        }]
      }]

理想效果↓

const newData = [111, 112, 113, 114, 116, 117, 119, 120, 121, 123]

每一个层级都有isOpen这个字段,遍历所有层级,isOpen为true的话就把同对象里的id PUSH进newData里面

我该怎么操作呢,感谢各位大神大哥的指导,可能对你们来说很简单,但我对树形结构得操作一窍不通,先感谢你们的回答,小弟感激不尽,还请轻喷!

阅读 3.4k
3 个回答
// => ["111", "112", "113", "114", "116", "117", "119", "120", "121", "123"]
console.log(deepFindOpenId(data))

function deepFindOpenId (list, result) {
  result = result || [], Array.isArray(list) && list.forEach(item => {
    item.isOpen && result.push(item.id)
    deepFindOpenId(item.children, result)
  })
  return result;
}
function getIdArr(arr) {
  const result = []
  function getId(arr) {
    return arr.forEach(item => {
      if (item.isOpen) {
        result.push(item.id)
      }
      if (item.children) {
        getId(item.children)
      }
    })
  }
  getId(arr)
  return result
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题