javascript - 嵌套复杂 JSON 中的搜索键

标签 javascript jquery json

我必须通过 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/

相关文章:

javascript - node.js 意外标记; Canvas

jquery - 无限卷轴 : set scrollTop() such that page does not shift

JavaScript onClick 隐藏和显示

javascript - 如何创建 Json 数组

java - 将 JSON 文件转换为字符串

javascript - 正确使用表单和输入元素

javascript - 使用javascript从单选按钮获取值

java - MOXy反序列化异常: A descriptor with default root element was not found in the project

javascript - 在 Javascript 中丢球,不是一个接一个地丢球,而是所有的球同时落下。 (必须与 'iterator' 相关)

JQuery 自动完成隐藏字段