怎么把这个data1数组改造成data2数组,相当于过滤其中isShow=false的对象?

let data1=[
      {
        isShow:true,
        children:[
          {
            isShow:true,
            nodeName:'天天下级文件夹',
            children:[
              {
                isShow:true,
                nodeName:'天天下下级文件夹',
                children:[]

              },
              {
                isShow:false,
                nodeName:'天天下下级文件夹2',
                children:[]

              },
            ]
          },
          {
            isShow:false,
            nodeName:'lala',
            children:[]
          }
        ],
        nodeName:'天天文件夹',
      },
      {
        isShow:true,
        nodeName:'一样',
        children:[]

      },
      {
        isShow:false,
        nodeName:'不一样',
        children:[]
      }
    ]

想要改造成以下这种

   let data2=[
       {
        isShow:true,
        children:[
          {
            isShow:true,
            nodeName:'天天下级文件夹',
            children:[
              {
                isShow:true,
                nodeName:'天天下下级文件夹',
                children:[]

              },
            ]
          },
        ],
        nodeName:'天天文件夹',
      },
      {
        isShow:true,
        nodeName:'一样',
        children:[]

      },
     
    ]
阅读 1.1k
5 个回答

用filter过滤,再加个递归就行了

function filterData(data){
    return data.filter(item => {
        if(item.isShow) {
            return true;
        } else if(item.children && item.children.length) {
            const res = filterData(item.children);
            if(res.length){
                item.children = res;
                return true;
            }
        }
        return false;
    })
}
function filterDeep(list, cb) {
  return list.reduce((res,v) => {
    cb(v) && res.push({...v, children: filterDeep(v.children || [], cb)})
    return res;
  }, [])
}

filterDeep(data1, item => item.isShow)

AI生成,已验证结果

let data1=[
  {
    isShow:true,
    children:[
      {
        isShow:true,
        nodeName:'天天下级文件夹',
        children:[
          {
            isShow:true,
            nodeName:'天天下下级文件夹',
            children:[]

          },
          {
            isShow:false,
            nodeName:'天天下下级文件夹2',
            children:[]

          },
        ]
      },
      {
        isShow:false,
        nodeName:'lala',
        children:[]
      }
    ],
    nodeName:'天天文件夹',
  },
  {
    isShow:true,
    nodeName:'一样',
    children:[]

  },
  {
    isShow:false,
    nodeName:'不一样',
    children:[]
  }
]

// 定义一个函数,接受一个数组作为参数,返回一个新的数组,只包含isShow为true的数据
function filterIsShow(data) {
  // 创建一个空数组,用来存放过滤后的结果
  let result = [];
  // 遍历原数组中的每个元素
  for (let item of data) {
    // 如果元素的isShow属性为true,就把它加入到结果数组中
    if (item.isShow) {
      // 如果元素还有children属性,就递归地调用函数,对children数组进行过滤,并把过滤后的结果赋值给元素的children属性
      if (item.children) {
        item.children = filterIsShow(item.children);
      }
      // 把元素加入到结果数组中
      result.push(item);
    }
  }
  // 返回结果数组
  return result;
}

// 调用函数,传入data1作为参数,得到过滤后的数据,并打印出来
let filteredData = filterIsShow(data1);
console.log(JSON.stringify(filteredData, null, 2));

帮你封装了函数方法,直接把data1数据传入,函数会返回data2数据
// filterVisible函数方法

function filterVisible(nodes) {
    // 过滤出 isShow 为 true 的节点
    const visibleNodes = nodes.filter(node => node.isShow);
    // 对于每个 visibleNode,递归处理其 children,并替换原始的 children
    visibleNodes.forEach(node => {
        if (node.children && node.children.length > 0) {
            node.children = filterVisible(node.children);
        }
    });
    return visibleNodes;
}

let data2 = filterVisible(data1);
console.log(data2);

推荐问题
宣传栏