/**
* @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://jkwzsj.com/article/dsojpss.html