js/vue/react 如何优化以下代码

 for (const i in data) {
        for (const z in data[i].children) {
          for (const u in data[i].children[z].children) {
            if (!data[i].children[z].children[u].isAuth) {
              delete data[i].children[z].children[u]
            }
          }
        }
      }

遍历这个data里children里的children,如果这里面的isOpen为false,就删除这条数据,这样子写很乱,希望大神们能帮优化以下

原数据结构参考↓

const data = [{
        name: '水果大全',
        id: '111',
        children: [{
          name: '浆果类',
          id: '112',
          children: [{
            name: '草莓',
            id: '113',
            isOpen: true
          }, {
            name: '桑椹',
            id: '114',
            isOpen: true
          }, {
            name: '黑莓',
            id: '115',
            isOpen: true
          }]
        }, {
          name: '柑橘类',
          id: '116',
          children: [{
            name: '橘子',
            id: '117',
            isOpen: true
          }, {
            name: '橙子',
            id: '118',
            isOpen: true
          }]
        }]
      }, {
        name: '奥特曼大全',
        id: '119',
        children: [{
          name: '昭和类',
          id: '120',
          children: [{
            name: '杰克',
            id: '121',
            isOpen: true
          }, {
            name: '泰罗',
            id: '122',
            isOpen: true
          }, {
            name: '艾斯',
            id: '123',
            isOpen: true
          }]
        }, {
          name: '平成类',
          id: '124',
          children: [{
            name: '迪迦',
            id: '125',
            isOpen: true
          }, {
            name: '盖亚',
            id: '126',
            isOpen: false // 这里是false,所以不要这一条id为126,name为盖亚的数据
          }]
        }]
      }]

感谢各位大神大哥的指导,先感谢你们的回答,小弟感激不尽,还请轻喷!

阅读 1.4k
2 个回答
const func = arr => {
      return arr
        .filter(r => r.isOpen !== false)
        .map(item => {
          const res = { ...item };
          if (item.children) res.children = func(item.children);
          return res;
        });
    };
   func(data) 

data每个元素相当于一棵树,需要过滤树的叶子节点,利用filter方法:

function filter(data) {
    function cb(node) {
        // 叶子节点通过isOpen过滤
        if(!node.children) {
            return node.isOpen;
        }
        return node.children = node.children.filter(cb);
    }
    // 原始data作为root节点的children
    return cb({ children: data });
}

// TEST
filter(data)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题