js遍历嵌套数组怎么处理?

data:[
        {
          title: "旅游",
          isOpen: true,
          children: [
            {
              title: "国内游",
              isOpen: true,
              children: [
                { 
                    title: "西藏",
                    isOpen: false,
                },{ 
                    title: "厦门",
                    isOpen: false,
                }
              ]
            },
            {
              title: "境外游",
              isOpen: false,
              children: [
                {
                    title: "日本",
                    isOpen: false,
                }, {
                    title: "澳大利亚",
                    isOpen: false,
                }
              ]
            }
          ]
        },
        {
          title: "交通",
          isOpen: false,
          children: [
            {
                title: "汽车",
                isOpen: false,
            }, {
                title: "摩托车",
                isOpen: false,
            }
          ]
        },
        {
          title: "家居",
          isOpen: false,
        }
      ]

原数据如上
输出规则:
如果上层isOpen:true,则处理它的children数据,并把children数据单独合数组,插入大树组中,以此类推。
基本输出结构如下

[[旅游,交通,家居],[国内游,境外游],[西藏,厦门]]
阅读 4.7k
3 个回答

递归

按你的数据结构就是形成了一颗树,用树的遍历方法就行了

  • 栗子:

    
      let data=[/*你的数据*/]
    
      let resultList=[]
      
      function deal(data){
        let temp=[]
        data.forEach(d => {
            temp.push(d.title)
            // 倒序
            // data.forEach(d=>d.isOpen&&deal(d.children))
        });
        resultList.push(temp)
        // 正序
        data.forEach(d=>d.isOpen&&deal(d.children))
      }
    
      deal(data)
      console.log(resultList)   
  • 效果

    clipboard.png

  • 整理一下

    let data=[/*你的数据*/]
    let resultList=[]
    function deal(data){
        let temp=[]
        data.forEach(({title}) => temp.push(title))
        resultList.push(temp)
        data.forEach(({isOpen,children})=>isOpen&&deal(children))
    }
    deal(data)
    console.log(resultList)  
const toArray = arr =>
  arr
    ? [arr.map(a => a.title)].concat(
        toArray(...arr.filter(a => a.isOpen).map(a => a.children)),
      )
    : []

使用递归,

let temporaryArray = [];

function filterData(data) {

    let title = data.map((item, index) => item.title);
    console.log(title);

    temporaryArray.push(title);

    let length = data.length;

    for(let i = 0; i < length; i++) {
        if(data[i].isOpen) {
            filterData(data[i].children);
        }
    }

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