VC_August 2017-04-20 04:24 采纳率: 100%
浏览 11383
已采纳

JS递归查找对象数组的某个值?

代码如下

任意给一个对对象或者数组,通过遍历,递归查找其中是否存在某个值,
代码我已经写的差不多了,但是只支持单次查找。
因为flag重置问题没法解决。
如果在函数体最后if里面,flag= false,则涉及到对象中的数组的时候就不起作用了。因为if(flag)虽然执行了
但是**并没有跳出递归。**

所以我的问题就是怎么正确重置flag~
希望有朋友能够解惑~_**

<script type="text/javascript">
    var flag = false;
    function exitindata(data,item){
    if(data instanceof Array){
         var i = data.length;
         while(i--){
            if(flag){
                break;
            }
            if(data[i] === item){
                flag = true;
                break
            }else{
                if(data[i] instanceof Array || data[i] instanceof Object){
                         exitindata(data[i],item);
                    }
            }
         }
    }else{
        for(var key in data){
            if(flag){   
                break
            }
            if(data.hasOwnProperty(key) === true){
                 if(data[key]  === item){
                    flag = true;
                    break
                 }else{
                    if(data[key] instanceof Array || data[key] instanceof Object){
                         exitindata(data[key],item);
                    }
                 }
            }
        }
    }
    if(flag){
        return true;
    }else{
        return null
    }
} 
function find(item){
    var data = [9,
    {
        item1:50,
        item2:94,
        item3:[
            {
                cc: 9999,
                ff:9090
            }
        ]
    }
    ,65,1111,54,11,0,1,3,7,8,5,649,841];
    console.log(exitindata(data,item));
}
find(9090)
find(9091)
find(9999)
</script>

单次查找没问题。
多次就出问题啦

  • 写回答

8条回答 默认 最新

  • Luvjuin 2017-04-20 06:14
    关注

    之前回答感觉都好乱,再来一次吧。楼主程序里面是有递归终止条件的,并不是没有。没看到的可以仔细看看。
    题主:你在exitindata函数中递归调用自身的时候,它有返回的值的,你用flag接住就可以了。同时,最后判断flag时,如果flag为true,要将flag重置为false,为下一次查找调用初始化flag

     <script type="text/javascript">
        var flag = false;
        function exitindata(data,item){
        if(data instanceof Array){
             var i = data.length;
             while(i--){
                if(flag){
                    break;
                }
                if(data[i] === item){
                    flag = true;
                    break
                }else{
                    if(data[i] instanceof Array || data[i] instanceof Object){
                             //此时用flag接住,如果递归找到,flag为true,否则为null
                                                    flag=exitindata(data[i],item);
                        }
                }
             }
        }else{
            for(var key in data){
                if(flag){   
                    break
                }
                if(data.hasOwnProperty(key) === true){
                     if(data[key]  === item){
                        flag = true;
                        break
                     }else{
                        if(data[key] instanceof Array || data[key] instanceof Object){
                             //此时用flag接住,如果递归找到,flag为true,否则为null
                                                    flag=exitindata(data[key],item);
                        }
                     }
                }
            }
        }
        if(flag){
            //重置flag,为下次查找初始化flag
            flag=false;
            return true;
        }else{
            return null
        }
    } 
    function find(item){
        var data = [9,
        {
            item1:50,
            item2:94,
            item3:[
                {
                    cc: 9999,
                    ff:9090
                }
            ]
        }
        ,65,1111,54,11,0,1,3,7,8,5,649,841];
        console.log(exitindata(data,item));
    }
    </script>
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(7条)

报告相同问题?

悬赏问题

  • ¥15 gwas 分析-plink 检查人口分层出现下面问题
  • ¥15 关于#matlab#的问题:需要 MATLAB 运行程序,对比四个多址通信方式(TDMA,FDMA,CDMA,OFDMA)的抗噪声性能
  • ¥15 有没有复现过PFENet的,如何解决?
  • ¥15 vue3使用swiper轮播图循环失败
  • ¥15 FDMA,OFDMA,TDMA 和 CDMA 系统容量对比仿真
  • ¥15 图神经网络的入侵检测
  • ¥15 工业数据采集技术+存储架构推荐
  • ¥15 GPT-SOVITS如何训练少数民族语言支持合成语音
  • ¥20 树莓派4b使用Camera Module 3时出现the system should be configured for the legacy camera stack问题
  • ¥200 GitHub开源程序配置在VScode调试