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

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条)

报告相同问题?

悬赏问题

  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能