前端 数据结构问题

A
  • 28

如果说有一段JSON是

[
  {
      name:'A',
      event:[
          {
            on:['change1']
          }
      ]
  },
  {
    name:'B',
    event:[
        {
            on:['change2']
        }
    ],
    child:[
        {
            name:'B',
            event:[
                {
                    on:['change2']
                }
            ],
            child:[
                ... 如此继续层叠
            ]
        },
    ]
  },
]

有什么办法能够最快速度找到 所有的on属性里面的内容呢

回复
阅读 319
3 个回答
✓ 已被采纳

树形数据结构的遍历都是要递归的,就看是怎么递归,广度优先还是深度优先,看你自己选择,数据量非常大,为了避免爆栈,建议广度优先,下面是一个深度优先的写法

function _find(arr, callback){
    arr.forEach(item => {
        item.event.forEach(eitem => {
            callback(eitem.on)
        })
        if(Array.isArray(item.child)){
            _find(item.child, callback)
        }
    })
}

_find(arr, function(list){
    console.log(list)
})
// ['change1']
// ['change2']
// ['change2']

PS:可以详细说下你的需求,只是找到所有的on属性,这个太宽泛了,具体的代码没法写

let list =[
  {
      name:'A',
      event:[
          {
            on:['change1']
          }
      ]
  },
  {
    name:'B',
    event:[
        {
            on:['change2']
        }
    ],
    child:[
        {
            name:'B',
            event:[
                {
                    on:['change2']
                }
            ]
        },
    ]
  },
];

let getTree=(list=[])=>list.flatMap(item=>item.event.flatMap(item=>item.on).concat(getTree(item.child || [])));
console.log(getTree(list));
// ['change1', 'change2', 'change2']

不需要这么复杂,一般这种场景最快的方法肯定是正则匹配咯

let paragraph = JSON.stringify(obj);
let regex = /(?<="on"\:\[)(.*?)(?=\])/g;
let found = paragraph.match(regex);
你知道吗?

宣传栏