我必须通过 JavaScript 或 jQuery 在嵌套的 JSON 中搜索键。在我的 JSON 对象中,所有键都是唯一的。我自己尝试了一些解决方案,但它们没有用。 这是我的代码:
json = {
"app": [{
"Garden": {
"Flowers": {
"Red flower": "Rose",
"White Flower": "Jasmine",
"Yellow Flower": "Marigold"
}
},
"Fruits": {
"Yellow fruit 1": "Mango",
"Green fruit 2": "Guava",
"White Flower 3": "groovy"
},
"Trees": {
"label": {
"Yellow fruit 2": [{"type a":"Pumpkin", "type b": "Banana",..}],
"White Flower 2": ["Bogan 1", "Bogan 2", ...]
}
}],...
}
如何在给定对象中搜索特定键?
如果我通过 lookup(json, "type a")
它应该返回 "Pumpkin"
,或者如果我搜索 "White Flower 2"
它应该返回 ["Bogan 1", "Bogan 2", ...]
这是我的尝试,但不起作用:
function lookup(obj, k){
for (key in obj){
value = obj[key];
if (k == key) return [k, value];
if (type(value) == "Object"){
var y = lookup(value, k);
if (y && y[0]== k)return y;
}
if(type(value) == "Array"){
for (i in value)
{
var x = lookup(value[i], k);
if (x && x[0]== k)return x;
}
}
console.log(key, value);
return null;
}
}
要查找对象的类型,我使用以下代码:
function type(object){
var stringConstructor = "test".constructor;
var arrayConstructor = [].constructor;
var objectConstructor = {}.constructor;
if (object === null) {
return "null";
}
else if (object === undefined) {
return "undefined";
}
else if (object.constructor === stringConstructor) {
return "String";
}
else if (object.constructor === arrayConstructor) {
return "Array";
}
else if (object.constructor === objectConstructor) {
return "Object";
}
else {
return "null";
}
}
最佳答案
你比你想象的更接近 - 将 return null;
移出 for (key in obj)
是主要的事情;否则,一旦对象中的 first 键不匹配,您就会放弃。搜索完所有键后才放弃。
function lookup(obj, k) {
for (var key in obj) {
var value = obj[key];
if (k == key) {
return [k, value];
}
if (typeof(value) === "object" && !Array.isArray(value)) {
var y = lookup(value, k);
if (y && y[0] == k) return y;
}
if (Array.isArray(value)) {
// for..in doesn't work the way you want on arrays in some browsers
//
for (var i = 0; i < value.length; ++i) {
var x = lookup(value[i], k);
if (x && x[0] == k) return x;
}
}
}
return null;
}
var json = {
"app": [{
"Garden": {
"Flowers": {
"Red flower": "Rose",
"White Flower": "Jasmine",
"Yellow Flower": "Marigold"
}
},
"Fruits": {
"Yellow fruit 1": "Mango",
"Green fruit 2": "Guava",
"White Flower 3": "groovy"
},
"Trees": {
"label": {
"Yellow fruit 2": [{
"type a": "Pumpkin",
"type b": "Banana"
}],
"White Flower 2": ["Bogan 1", "Bogan 2"]
}
}
}]
}
function type(object) {
var stringConstructor = "test".constructor;
var arrayConstructor = [].constructor;
var objectConstructor = {}.constructor;
if (object === null) {
return "null";
} else if (object === undefined) {
return "undefined";
} else if (object.constructor === stringConstructor) {
return "String";
} else if (object.constructor === arrayConstructor) {
return "Array";
} else if (object.constructor === objectConstructor) {
return "Object";
} else {
return "null";
}
}
console.log(lookup(json, 'type a'));
console.log( lookup(json, 'White Flower 2') );
附注没有“JSON 对象”这样的东西。如果不是字符串,则不是 JSON。您正在搜索 JavaScript 对象。
关于javascript - 嵌套复杂 JSON 中的搜索键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38805134/