Javascript 在json中查找密钥
我有以下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
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);