按关键字递归数组查找对象


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)