根据数组对象里面的某一对象属性值找到该对象里面其他属性值

128 阅读1分钟

有如下数组:

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'))  
       
![image.png](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/56ffe24285aa497b90f49fc8712c1f24~tplv-k3u1fbpfcp-watermark.image?)
       //我们要找到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')))
       // 最后的结果是 ['我是旧的儿子的孙子的孙子']