多层级数组如何根据id匹配某个字段的值

{"code":0,"msg":"成功","data":[{"children":[{"children":[],"id":2,"code":"S1","name":"销售部1"},{"children":[],"id":3,"code":"S2","name":"销售部2"}],"id":1,"code":"S","name":"销售部"},{"children":[{"children":[],"id":8,"code":"C1","name":"生产部1"}],"id":4,"code":"C","name":"生产部"},{"children":[],"id":5,"code":"Q","name":"质检部"},{"children":[],"id":6,"code":"W","name":"财务部"},{"children":[],"id":7,"code":"G","name":"采购部"}],"total":0}


  • 请问上面格式的数组如何根据id匹配code,两个for循环的会报错
阅读 4.4k
3 个回答
var response = {"code":0,"msg":"成功","data":[{"children":[{"children":[],"id":2,"code":"S1","name":"销售部1"},{"children":[],"id":3,"code":"S2","name":"销售部2"}],"id":1,"code":"S","name":"销售部"},{"children":[{"children":[],"id":8,"code":"C1","name":"生产部1"}],"id":4,"code":"C","name":"生产部"},{"children":[],"id":5,"code":"Q","name":"质检部"},{"children":[],"id":6,"code":"W","name":"财务部"},{"children":[],"id":7,"code":"G","name":"采购部"}],"total":0}



function findNode(list, cb) {
  for(const item of list) {
    if(cb(item)) return item
    if(Array.isArray(item.children)) {
      const child = findNode(item.children, cb)
      if(child) return child
    }
  }
  return null;
}

var item = findNode(response.data, item => item.id == 2)
console.log(item)

贴出来我自己的解决方案吧
先将多层级数组扁平化处理
// 扁平化处理参考https://segmentfault.com/q/1010000016781339 第二个回答

function arrayChildrenFlatten(array, { childrenKeys, flattenParent, flattenParentKey } = {}) {
  childrenKeys = childrenKeys || ['children']
  flattenParent = flattenParent || []
  flattenParentKey = flattenParentKey || 'flattenParent'
  const result = []
  array.forEach(item => {
    const flattenItem = JSON.parse(JSON.stringify(item))
    flattenItem[flattenParentKey] = flattenParent
    result.push(flattenItem)
    childrenKeys.forEach(key => {
      if (item[key] && Array.isArray(item[key])) {
        const children = arrayChildrenFlatten(item[key], {
          childrenKeys,
          flattenParent: [...flattenParent, item],
          flattenParentKey
        })
        result.push(...children)
      }
    })
  })
  return result
}

然后再去查询一遍

this.form.departCode = this.findNode(arrayChildrenFlatten(dataArray), newVal)
// dataArray是原数组,newVal是要查询的值

findNode(data, newVal) {
      if (data.find(item => item.id == newVal)) {
        return data.find(item => item.id == newVal).code
      } else {
        return '暂无'
      }
    }
    

一楼大佬的解决方案更优,赞!

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