遍历树型数据节点,查找符合条件的节点
/**
* 遍历树数据节点,查找符合条件的节点
* @param {Array|Object} data 数据树,如 {id:1, children:[{id:2}]}
* @param {Boolean} isFindOne 是否只找最先符合条件的一个
* @param {Function} fn 查找回调函数,回调参数:item 节点,index节点当前兄弟节点中的索引,data 查找的数据树,函数返回true表示符合条件
* @param {string} [field=children] 子级字段名称
* @returns {Array|Object} 查找结果,isFindOne为true时返回Object, false时返回Array
*/
traverse (data = [], isFindOne, fn, field = 'children') {
let result = []
data = Array.isArray(data) ? data : [data]
for (let i = 0, len = data.length; i < len; i++) {
const item = data[i]
const checked = fn(item, i, data)
const children = item[field]
if (checked) {
result.push(item)
if (isFindOne) break
}
if (children) {
const child = traverse(children, isFindOne, fn, field)
if (child) result = result.concat(child)
}
}
return isFindOne ? result[0] || null : result
}
//执行
let id = '1-1'
let list = [
{
id:'1',