有如下数组:
const newArr = [
{
value:'我是新的',
name:'1'
},
{
name: '7',
value: '我是生产中的技能'
},
{
name: '2',
value: '我是生产中的技能'
},
{
value:'我是旧的',
name:'2',
children: [
{
value: '我是旧的儿子',
name: '3',
skills: {
value: '我会唱,跳,rap,篮球',
name: '4'
},
children: [
{
value: '我是旧的儿子的孙子',
name: '5',
children: [
{
value: '我是旧的儿子的孙子的孙子',
name: '6',
children: [
]
}
]
}
]
}
]
}]
我们需要根据name的值找到所有对应的value值输出在屏幕上(项目要求输出一个数组)。 话不多说,直接上代码。
//判断一下是否为对象
const isObject = (obj) => {
return Object.prototype.toString.call(obj) === '[object Object]'
}
const getValue = (item, name) => {
let result = ''
for(const key in item) {
if(item[key] === name && key === 'name') {
result = item['value'] //这里我们只要有值,就把它返回
return result
} else {
// 如果遍历的途中对象里面还嵌套了一层数组或者对象的话
let res = dictName(item[key], name)
if(res !== '') {
return res
}
}
}
return result
}
const dictName = (source, name) => {
let result = ''
let res = []
//判断是否为数组,如果是数组的话,用map结构遍历每一个值,
//所以在用map遍历的时候用getValue来遍历对象,
if(Array.isArray(source)) {
if(source.length !== 0) {
res = source.map((item) => {
result = getValue(item, name)
return result
// console.log(result);
})
result = res.filter((item) => (item !== undefined && item !== ''))
} else {
return ''
}
} else if(isObject(source)) {
result = getValue(source, name)
}
return result
}
// 由于之前输出的数组有嵌套层级。
//比如 console.log(dictName(newArr, '6'))

//我们要找到name为6的所有 value值的话,输出的数组有层级,所以还要数组扁平化一下(本人较菜,暂时写成这样。。。)
let result = []
const flatter = (arr) => {
for(const item of arr) {
if(Array.isArray(item)) {
flatter(item)
} else {
result.push(item)
}
}
return result
}
//console.log(flatter(dictName(newArr, '6')))
// 最后的结果是 ['我是旧的儿子的孙子的孙子']