按关键字递归数组查找对象
const target = [ { label: '占用道路问题', value: 31, children: [ { label: '经营占道', value: 35, children: [ { label: '店外经营占道', value: 40, children: null }, { label: '流动摊贩占道', value: 41, children: null } ] }, { label: '垃圾占道', value: 36, children: [ { label: '生活垃圾', value: 42, children: null }, { label: '建筑垃圾', value: 43, children: null }, { label: '工业垃圾', value: 44, children: null } ] }, { label: '车辆占道', value: 37, children: [ { label: '机动车占道', value: 45, children: null }, { label: '非机动车占道', value: 46, children: null } ] }, { label: '霸占车位', value: 38, children: [] }, { label: '其他占道', value: 39, children: [] } ] }, { label: '“两违”问题', value: 32, children: [ { label: '违法建筑', value: 58, children: [ { label: '房屋违建', value: 61, children: null }, { label: '小区违建', value: 62, children: null }, { label: '违建棚架', value: 63, children: null } ] }, { label: '违法用地', value: 59, children: [] }, { label: '其他违建', value: 60, children: [] } ] }, { label: '市容设施管理问题', value: 33, children: [ { label: '道路损坏', value: 47, children: [] }, { label: '垃圾桶损坏', value: 48, children: [] }, { label: '下水道堵塞', value: 49, children: [] }, { label: '井盖损坏', value: 50, children: [] }, { label: '路灯损坏', value: 51, children: [] }, { label: '树木修剪', value: 52, children: [] }, { label: '水电气', value: 53, children: [] }, { label: '户外广告牌', value: 54, children: [] }, { label: '隔音屏损坏', value: 55, children: [] }, { label: '洒水车问题', value: 56, children: [] }, { label: '其他', value: 57, children: [] } ] }, { label: '其他问题', value: 34, children: [] } ] function findObj(objects, label) { const queue = [...objects] while (queue.length) { const o = queue.shift() if (o.label === label) return o queue.push(...(o.children || [])) } } console.log(findObj(target, '市容设施管理问题')) /** * @description: 递归遍历查找数组对象的某个值 * @param {string} label * @param {array} arr * @returns {object} */ function findObj1(arr, label) { for (const item of arr) { if (item.label === label) return item if (item.children && item.children.length) { const _item = findObj1(item.children, label) if (_item) return _item } } } console.log(findObj1(target, '洒水车问题'))
查找子级和父级
let arr = [ { categoryId: 'D3E0C093A499D944E053DC031EACCAF9', categoryCode: 2, categoryName: '橱柜', parentCategoryId: null, levelCode: 1, validFlag: 1, displayFlag: 1, isMapping: 1, children: [ { categoryId: 'D4BDA7B60B325520E053DC031EACC267', categoryCode: 8, categoryName: '工艺柜', parentCategoryId: 'D3E0C093A499D944E053DC031EACCAF9', levelCode: 2, validFlag: 1, displayFlag: 1, isMapping: 0, children: [ { categoryId: 'D4BDF7859B147241E053DC031EAC8826', categoryCode: 46, categoryName: '包覆工艺柜', parentCategoryId: 'D4BDA7B60B325520E053DC031EACC267', levelCode: 3, validFlag: 1, displayFlag: 1, isMapping: 0, children: null, label: '包覆工艺柜' }, { categoryId: 'D4BDF7859B157241E053DC031EAC8826', categoryCode: 47, categoryName: '实木油漆工艺柜', parentCategoryId: 'D4BDA7B60B325520E053DC031EACC267', levelCode: 3, validFlag: 1, displayFlag: 1, isMapping: 0, children: null, label: '实木油漆工艺柜' }, { categoryId: 'D4BDF7859B167241E053DC031EAC8826', categoryCode: 48, categoryName: '饰面工艺柜', parentCategoryId: 'D4BDA7B60B325520E053DC031EACC267', levelCode: 3, validFlag: 1, displayFlag: 1, isMapping: 0, children: null, label: '饰面工艺柜' }, { categoryId: 'D4BDF7859B177241E053DC031EAC8826', categoryCode: 49, categoryName: '吸塑工艺柜', parentCategoryId: 'D4BDA7B60B325520E053DC031EACC267', levelCode: 3, validFlag: 1, displayFlag: 1, isMapping: 0, children: null, label: '吸塑工艺柜' }, { categoryId: 'D4BDF7859B187241E053DC031EAC8826', categoryCode: 50, categoryName: '油漆工艺柜', parentCategoryId: 'D4BDA7B60B325520E053DC031EACC267', levelCode: 3, validFlag: 1, displayFlag: 1, isMapping: 0, children: null, label: '油漆工艺柜' } ], label: '工艺柜' }, { categoryId: 'D4BDA7B60B335520E053DC031EACC267', categoryCode: 9, categoryName: '器具', parentCategoryId: 'D3E0C093A499D944E053DC031EACCAF9', levelCode: 2, validFlag: 1, displayFlag: 1, isMapping: 0, children: [ { categoryId: 'D4BDF7859B197241E053DC031EAC8826', categoryCode: 51, categoryName: '插座', parentCategoryId: 'D4BDA7B60B335520E053DC031EACC267', levelCode: 3, validFlag: 1, displayFlag: 1, isMapping: 0, children: null, label: '插座' }, { categoryId: 'D4BDF7859B1A7241E053DC031EAC8826', categoryCode: 52, categoryName: '挂件', parentCategoryId: 'D4BDA7B60B335520E053DC031EACC267', levelCode: 3, validFlag: 1, displayFlag: 1, isMapping: 0, children: null, label: '挂件' }, { categoryId: 'D4BDF7859B1B7241E053DC031EAC8826', categoryCode: 53, categoryName: '集成灶', parentCategoryId: 'D4BDA7B60B335520E053DC031EACC267', levelCode: 3, validFlag: 1, displayFlag: 1, isMapping: 0, children: null, label: '集成灶' }, { categoryId: 'D4BDF7859B1C7241E053DC031EAC8826', categoryCode: 54, categoryName: '净水器', parentCategoryId: 'D4BDA7B60B335520E053DC031EACC267', levelCode: 3, validFlag: 1, displayFlag: 1, isMapping: 0, children: null, label: '净水器' }, { categoryId: 'D4BDF7859B1D7241E053DC031EAC8826', categoryCode: 55, categoryName: '垃圾桶', parentCategoryId: 'D4BDA7B60B335520E053DC031EACC267', levelCode: 3, validFlag: 1, displayFlag: 1, isMapping: 0, children: null, label: '垃圾桶' }, { categoryId: 'D4BDF7859B1E7241E053DC031EAC8826', categoryCode: 56, categoryName: '拉篮', parentCategoryId: 'D4BDA7B60B335520E053DC031EACC267', levelCode: 3, validFlag: 1, displayFlag: 1, isMapping: 0, children: null, label: '拉篮' }, { categoryId: 'D4BDF7859B1F7241E053DC031EAC8826', categoryCode: 57, categoryName: '龙头', parentCategoryId: 'D4BDA7B60B335520E053DC031EACC267', levelCode: 3, validFlag: 1, displayFlag: 1, isMapping: 0, children: null, label: '龙头' }, { categoryId: 'D4BDF7859B207241E053DC031EAC8826', categoryCode: 58, categoryName: '其他', parentCategoryId: 'D4BDA7B60B335520E053DC031EACC267', levelCode: 3, validFlag: 1, displayFlag: 1, isMapping: 0, children: null, label: '其他' }, { categoryId: 'D4BDF7859B217241E053DC031EAC8826', categoryCode: 59, categoryName: '热水器', parentCategoryId: 'D4BDA7B60B335520E053DC031EACC267', levelCode: 3, validFlag: 1, displayFlag: 1, isMapping: 0, children: null, label: '热水器' }, { categoryId: 'D4BDF7859B227241E053DC031EAC8826', categoryCode: 60, categoryName: '实木类', parentCategoryId: 'D4BDA7B60B335520E053DC031EACC267', levelCode: 3, validFlag: 1, displayFlag: 1, isMapping: 0, children: null, label: '实木类' }, { categoryId: 'D4BDF7859B237241E053DC031EAC8826', categoryCode: 61, categoryName: '水盆', parentCategoryId: 'D4BDA7B60B335520E053DC031EACC267', levelCode: 3, validFlag: 1, displayFlag: 1, isMapping: 0, children: null, label: '水盆' }, { categoryId: 'D4BDF7859B247241E053DC031EAC8826', categoryCode: 62, categoryName: '微波炉', parentCategoryId: 'D4BDA7B60B335520E053DC031EACC267', levelCode: 3, validFlag: 1, displayFlag: 1, isMapping: 0, children: null, label: '微波炉' }, { categoryId: 'D4BDF7859B257241E053DC031EAC8826', categoryCode: 63, categoryName: '洗碗机', parentCategoryId: 'D4BDA7B60B335520E053DC031EACC267', levelCode: 3, validFlag: 1, displayFlag: 1, isMapping: 0, children: null, label: '洗碗机' }, { categoryId: 'D4BDF7859B267241E053DC031EAC8826', categoryCode: 64, categoryName: '消毒柜', parentCategoryId: 'D4BDA7B60B335520E053DC031EACC267', levelCode: 3, validFlag: 1, displayFlag: 1, isMapping: 0, children: null, label: '消毒柜' }, { categoryId: 'D4BDF7859B277241E053DC031EAC8826', categoryCode: 65, categoryName: '烟机罩', parentCategoryId: 'D4BDA7B60B335520E053DC031EACC267', levelCode: 3, validFlag: 1, displayFlag: 1, isMapping: 0, children: null, label: '烟机罩' }, { categoryId: 'D4BDF7859B287241E053DC031EAC8826', categoryCode: 66, categoryName: '蒸烤箱', parentCategoryId: 'D4BDA7B60B335520E053DC031EACC267', levelCode: 3, validFlag: 1, displayFlag: 1, isMapping: 0, children: null, label: '蒸烤箱' } ], label: '器具' } ], label: '橱柜' } ] // 查找对象 function findBFS(objects, nodeId) { const queue = [...objects] while (queue.length) { const item = queue.shift() if (item.categoryId === nodeId) { return item } else { queue.push(...(item.children || [])) } } } // 查找父级 function getParent(data2, nodeId2) { var arrRes = [] if (data2.length === 0) { if (!!nodeId2) { arrRes.unshift(data2) } return arrRes } let rev = (data, nodeId) => { for (var i = 0, length = data.length; i < length; i++) { let node = data[i] if (node.categoryId === nodeId) { arrRes.unshift(node) rev(data2, node.parentCategoryId) // 注意这里是传入的tree,不要写成data了,不然遍历的时候一直都是node.children,不是从最顶层开始遍历的 break } else { if (!!node.children) { rev(node.children, nodeId) } } } return arrRes } arrRes = rev(data2, nodeId2) return arrRes } let ret = findBFS(arr, 'D4BDF7859B277241E053DC031EAC8826') console.log(ret) let ret2 = getParent(arr, 'D4BDF7859B277241E053DC031EAC8826') console.log(ret2)