接上一篇使用递归获取Tree数据结构中的目标数据,封装了一个通用函数

/**
 * @param {Array} dataList 完整数据(必传)
 * @param {Sting/Int} keyName 对哪个字段进行与targetID对比(必传)
 * @param {Sting/Int} targetID 目标数据的唯一标识符(必传)
 * @param {Sting/Int} fieldName 目标数据的某个字段的字段名(可缺省)
 * @return {Object/String/Int/Array} 返回的目标数据, 目标数据类型根据 fieldName 字段的类型确定,默认返回Object
*/
function functionRecursive({ dataList, keyName, targetID, fieldName }) {
 let target_data= {}
 let targetID_type= ['string', 'number']
if (!Array.isArray(dataList) || !dataList.length) {
  alert('传入的数据格式需为数组且不能为空...')
return target_data
 }
if (!keyName || typeof keyName !== 'string') {
  alert('未传入对比字段名称...')
return target_data
 }
if (!targetID) {
  alert('未传入目标数据的唯一标识符...')
return target_data
 }
 let ID_type= typeof targetID
if (!targetID_type.includes(ID_type)) {
  alert('目标数据唯一标识符应为数字或字符串...')
return target_data
 }

// 递归过程
 let get_target_data = item => {
if (item[keyName] == targetID) {
   target_data= item
  }else {
if (item.children && item.children.length) {
for (let i = 0; i < item.children.length; i++) {
if (Object.keys(target_data).length) break // 如果已经找到了目标数据,记得break
     get_target_data(item.children[i])
    }
   }
  }
 }

// for循环传入的 dataList 数据并开始递归
 for (let i = 0; i < dataList.length; i++) {
if (Object.keys(target_data).length) break // 同上
  get_target_data(dataList[i])
 }

// 返回目标数据
 if (fieldName && typeof fieldName == 'string') {
if (target_data.hasOwnProperty(fieldName)) {
return target_data[fieldName]
  }else {
   alert('字段名应为字符串或目标数据中无此字段...')
return {}
  }
 }else {
return target_data
 }
}

exportdefault functionRecursive

名称栏目:接上一篇使用递归获取Tree数据结构中的目标数据,封装了一个通用函数
转载注明:http://hbruida.cn/article/dsojpss.html