【问题标题】:Searching through JSON array using JavaScript/jQuery使用 JavaScript/jQuery 搜索 JSON 数组
【发布时间】:2014-01-11 07:01:34
【问题描述】:

我正在使用 Google 地图返回用户所在位置的位置名称和状态。这是我感兴趣的部分:

"address_components" : [
        {
           "long_name" : "Salem",
           "short_name" : "Salem",
           "types" : [ "locality", "political" ]
        },
        {
           "long_name" : "Rockingham",
           "short_name" : "Rockingham",
           "types" : [ "administrative_area_level_2", "political" ]
        },
        {
           "long_name" : "New Hampshire",
           "short_name" : "NH",
           "types" : [ "administrative_area_level_1", "political" ]
        },
        {
           "long_name" : "United States",
           "short_name" : "US",
           "types" : [ "country", "political" ]
        }
     ]

有没有办法使用 JavaScript 或 jQuery 查找哪些对象包含“locality”和“administrative_area_level_1”值并返回相应对象的“long_name”字符串?我该怎么做呢?

【问题讨论】:

  • 检查当前选中的对象是否有一个包含字符串“locality or Administrative_area_level_1”的数组..
  • @AkshayKhandelwal,我该怎么做?
  • 在下面查看我的答案

标签: javascript jquery json


【解决方案1】:

试试这个:

var data = {"address_components" : [
        {
           "long_name" : "Salem",
           "short_name" : "Salem",
           "types" : [ "locality", "political" ]
        },
        {
           "long_name" : "Rockingham",
           "short_name" : "Rockingham",
           "types" : [ "administrative_area_level_2", "political" ]
        },
        {
           "long_name" : "New Hampshire",
           "short_name" : "NH",
           "types" : [ "administrative_area_level_1", "political" ]
        },
        {
           "long_name" : "United States",
           "short_name" : "US",
           "types" : [ "country", "political" ]
        }
]};
for(var i = 0; i < data.address_components.length; i++){
    if(data[i].long_name == 'something'){
      // do something
    }
    //or
    if(data[i].types[0] == 'administrative_area_level_1'){
      // do something
    }
}

【讨论】:

    【解决方案2】:

    试试这个,

    var addr_comp = [{"long_name": "Salem","short_name": "Salem","types": ["locality", "political"]}, {"long_name": "Rockingham","short_name": "Rockingham","types": ["administrative_area_level_2", "political"]}, {"long_name": "New Hampshire","short_name": "NH","types": ["administrative_area_level_1", "political"]}, {"long_name": "United States","short_name": "US","types": ["country", "political"]}];
    function getlocalityAdminLevel(addrType){
        for(var a=0,len=addr_comp.length;a<len;a++){
            ac=addr_comp[a];
            if(ac.types){
                for (var t = 0, tl = ac.types.length; t < tl; t++) {
                    ty = ac.types[t];
                    if (ty == addrType) {
                        return ac;break;
                    } 
                }
            }
        }
    }
    console.log(getlocalityAdminLevel('locality'));
    console.log(getlocalityAdminLevel('administrative_area_level_1'));
    

    Working demo

    你可以像这样使用long_nameshort_name

    locality=getlocalityAdminLevel('locality');
    if(locality && locality.long_name){
        alert(locality.long_name);
    }
    

    Demo 1

    【讨论】:

      【解决方案3】:

      给你。请找小提琴here

      通过使用如下函数:

      function getLocality(){
          for(var i = 0 ; i< address_components.length; i++){
              var obj = address_components[i];
              var arr = obj["types"];
              for(var j = 0; j<arr.length;j++ ){
                  if(arr[j] == "locality"){
                      return obj;
                  }
              }
      
          }
      }
      

      或者更确切地说,写一个做同样事情的 Array 原型

      Array.prototype.getByType = function(type){
          for(var i = 0 ; i< address_components.length; i++){
              var obj = address_components[i];
              var arr = obj["types"];
              for(var j = 0; j<arr.length;j++ ){
                  if(arr[j] == type){
                      return obj;
                  }
              }
      
          }
      }
      

      并使用原型如下:

      address_components.getByType("administrative_area_level_1").long_name // Note that you pass the type to the prototype function that does the job for you
      

      其中 address_components 是 Google 地图返回的数组

      【讨论】:

      • 当然,您发送要解析的数组以获取值。因此,如果您的返回值位于 var data = {} 之类的数据对象中,并且您将返回值保存为 data = {"address_components" : [{...}]},那么您将传递 data["address_components"].getById..
      【解决方案4】:

      你可以使用这个 JS 库,而不是污染你的代码; DefiantJS (http://defiantjs.com) 使用“搜索”方法扩展全局对象 JSON。此方法使您能够使用 XPath 查询语法搜索 JSON 结构。结果是您的代码变得更加清晰易读。

      这是工作小提琴;
      http://jsfiddle.net/hbi99/SjvZ9/

      var data = {
             ...
          },
          res = JSON.search( data, '//*[types="administrative_area_level_1" or types="locality"]' ),
          str = '';
      
          for (var i=0; i<res.length; i++) {
              str += res[i].long_name +'<br/>';
          }
      
          document.getElementById('output').innerHTML = str;
      

      不熟悉 XPath?查看这个 XPath Evaluator,让您了解它是多么容易; http://www.defiantjs.com/#xpath_evaluator

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多