Javascript 在json中查找密钥

Javascript 在json中查找密钥,javascript,node.js,json,recursion,Javascript,Node.js,Json,Recursion,我有以下json: let object = { "statusCode": 200, "body": [{ "id": "3", "externalId": "billgates", "status": "active", "createdAt": "2018-11-14T08:36:50.967Z", "updatedAt": "2018-11-14T08:36:50.967Z", "firstN

我有以下json:

let object = {
"statusCode": 200,
"body": [{
        "id": "3",
        "externalId": "billgates",
        "status": "active",
        "createdAt": "2018-11-14T08:36:50.967Z",
        "updatedAt": "2018-11-14T08:36:50.967Z",
        "firstName": "yehu",
        "lastName": "da",
        "email": "bg@g.com"
    }
],
"headers": {
    "x-powered-by": "Express",
    "access-control-allow-origin": "*",
    "content-type": "application/json; charset=utf-8",
    "content-length": "189",
    "etag": "W/\"bd-Emx3/KChQLzf9+6bgFSHXPQgDTM\"",
    "date": "<<Masked>>",
    "connection": "close"
},
"request": {
    "uri": {
        "protocol": "http:",
        "slashes": true,
        "auth": null,
        "host": "mysite",
        "port": "4202",
        "hostname": "mysite",
        "hash": null,
        "search": "?username=billgates",
        "query": "username=billgates",
        "pathname": "/v1/users",
        "path": "/v1/users?username=billgates",
        "href": "http://mysite"
    },
    "method": "GET",
    "headers": {
        "Content-Type": "application/json",
        "accept": "application/json",
        "content-length": 2
    }
}
在VS代码(node.js)中运行函数后,我得到以下错误:

RangeError:超出了最大调用堆栈大小


调试完函数后,我没有发现问题。似乎在某一点之后,localKey将始终为零,obj[localKey]将始终为3。

虽然有不同的解决方案,但您仍然可以尝试以下方法

let对象={
“状态代码”:200,
“正文”:[{
“id”:“3”,
“外部化”:“比尔盖茨”,
“状态”:“活动”,
“createdAt”:“2018-11-14T08:36:50.967Z”,
“更新日期”:“2018-11-14T08:36:50.967Z”,
“名”:“野胡”,
“姓氏”:“da”,
“电子邮件”:bg@g.com"
}
],
“标题”:{
“x-powered-by”:“Express”,
“访问控制允许来源”:“*”,
“内容类型”:“应用程序/json;字符集=utf-8”,
“内容长度”:“189”,
“etag”:“W/\”bd-Emx3/KChQLzf9+6bgFSHXPQgDTM\”,
“日期”:“日期”,
“连接”:“关闭”
},
“请求”:{
“uri”:{
“协议”:“http:”,
“斜杠”:没错,
“auth”:空,
“主机”:“mysite”,
“端口”:“4202”,
“主机名”:“mysite”,
“哈希”:null,
“搜索”:?用户名=比尔盖茨“,
“查询”:“用户名=比尔盖茨”,
“路径名”:“/v1/用户”,
“路径”:“/v1/users?username=billgates”,
“href”:”http://mysite"
},
“方法”:“获取”,
“标题”:{
“内容类型”:“应用程序/json”,
“接受”:“应用程序/json”,
“内容长度”:2
}
}
}
函数findValue(obj、k、v){
设res=false
如果(!obj | | typeof obj!=“object”)返回false
如果(obj[k]==v)返回true
否则{
for(让Object.entries(obj))的[key,value]{
if(Array.isArray(value)){res=res | | value.some(d=>findValue(d,k,v))}
if(typeof value==“object”){res=res | | findValue(value,k,v)}
}
}
返回res
}
log(findValue(对象'externalId','billgates'))
log(findValue(对象'lastName','da'))
log(findValue(对象,'x-powered-by','Express'))

log(findValue(对象'externalId',Nitish'))
hint。。。导致问题的是
“id”:“3”,
(您需要检查
obj[localKey]
在递归之前是一个实际对象…您还需要正确递归-因为除非在顶层找到键,否则一旦修复无限递归,您将始终无法定义请注意,如果您处理的是一个没有有意义的内部原型的普通对象,
hasOwnProperty
检查是多余的。(或者只需使用
Object.keys
/
条目
,它们只直接在对象上迭代属性)对您的代码进行最快的修复-但我现在不会这样做all@Bravo为什么你不这样做。有什么问题吗?老实说,我不知道为什么我会说:p我很快尝试了其他方法,并意识到这部分陈述的错误:
let key = "externalId";
let value = "bilgates"
let findValue = function findValue(obj, key, value) {
            for(let localKey in obj){
                if(obj.hasOwnProperty(localKey)){
                    if(localKey === key){
                        res = obj[localKey] === value;
                        return res;
                    }
                    else{
                        let val = obj[localKey];
                        findValue(val, key, value);
                    }
                }
            }
        }
 let res = findValue(object, key, value)
 console.log(res);