【问题标题】:How to find value in json [duplicate]如何在json中查找值[重复]
【发布时间】:2016-03-30 18:53:38
【问题描述】:

如何在下面的 json 数据中使用邮政编码来细化国家名称;

var data = '{
  "1": {
    "state": "VIC",
    "postcode": "2600,2603,2605,2606"
  },
  "2": {
    "state": "NSW",
    "postcode": "2259,2264"
  }
}'

如何通过postcode找到state

如果我搜索邮政编码2600 如果得到类似VIC 的结果

【问题讨论】:

  • 首先,您想要 JSON.parse(data) (虽然,这不会按原样工作,因为您发布的内容不是有效的 javascript) - 那么它只是一个普通对象,您将成为处理
  • if i search postcode - 你怎么“搜索”...显示一些代码
  • 在某些函数中传递邮政编码值和函数返回状态名称
  • 无论您如何处理这些数据,都会出错... 2600->2639 范围内的邮政编码不是 VIC
  • 我从 Javascript 标记中假设您想在 Javascript 中解析它,但如果您只需要从包含 JSON 数据的文件中提取值,您最好的选择是 jq:stedolan.github.io/jq

标签: javascript json


【解决方案1】:

删除 '' 因为你的不是有效字符串,删除 '' 使其成为有效的对象字面量,然后你可以遍历 Object 的键并检查它是否具有匹配的 POSTCODE,如果它有然后返回对应的状态。

var data = {
  "1": {
    "state": "VIC",
    "postcode": "2600,2603,2605,2606"
  },
  "2": {
    "state": "NSW",
    "postcode": "2259,2264"
  }
};

function getState(data, postcode){

  for(var x in data){
    if(data[x].postcode && data[x].postcode.split(",").indexOf(postcode.toString())!=-1) return data[x].state;
  }
  
  return "Not Found";
  
}

alert(getState(data, "2600"));
alert(getState(data, 2264));

您可以直接在邮政编码上使用.indexOf,即使不使用.split(",")。但是,它也会与 ,2600 匹配,但情况并非如此。所以,请使用split

使用json[x].postcode 条件确保对象中存在邮政编码字段。否则不存在就会报错。

【讨论】:

  • 如果您从数据中删除 '',则它不再是 JSON,而是对象文字
  • @RGraham 不是 JSON 而是语法错误
  • @RGraham 这是 OP 代码中的语法错误。
  • @CodeiSir 正确。 OP 拥有的是一个 JSON 字符串,尽管构造不正确,但这也不是 JSON。不是说这是错误的,只是术语不正确。
  • @CodeiSir 先生,你的我是有效的 JSON 字符串 :)
【解决方案2】:

function findState(data, postcode) {
  var postcode = postcode.toString()
  for (var k in data) {
    var postcodes = data[k].postcode.split(",")
    if (postcodes.indexOf(postcode) != -1)
      return data[k].state
  }
}

// Demo Output
var data = '{"1":{"state":"VIC","postcode":"2600,2603,2605,2606"},"2":{"state":"NSW","postcode":"2259,2264"}}'
var dataObj = JSON.parse(data)

var state = findState(dataObj, 2600)
document.write(state)

【讨论】:

    【解决方案3】:

    这样试试

    var data = '{"1": { "state": "VIC","postcode": "2600,2603,2605,2606"}, "2": {"state": "NSW","postcode": "2259,2264"}}';
    var jsObj = JSON.parse(data);
    var find = "2600";
    
    var values = Object.keys(jsObj).filter(function(x) {
      return jsObj[x].postcode.indexOf(find) > -1;
    }).map(function(x) {
      return jsObj[x].state;
    });
    
    console.log(values.length > 0 ? values[0] : "not found");
    

    JSFIDDLE

    【讨论】:

    • 你也不是,@CodeiSir - 考虑成千上万个邮政编码的 10 个真实世界数据......发布的答案都不会很好
    • @JaromandaX 你如何让“我的”更快? (这与接受的答案几乎相同,来自.toString(),这被称为经常:P
    • 我无法让您或其他任何人的速度更快-我会以不同的方式编写它-您提出了性能,我只是指出这个简单示例的性能在所有答案中可以忽略不计
    【解决方案4】:

    你可以试试这样的:

    function searchInObject(object, searchKey, searchValue) {
      for (var i in object) {
        if (object[i][searchKey].indexOf(searchValue) > -1) {
          return object[i];
        }
      }
    }
    
    (function() {
      var data = {
        "1": {
          "state": "VIC",
          "postcode": "2600,2603,2605,2606"
        },
        "2": {
          "state": "NSW",
          "postcode": "2259,2264"
        }
      }
    
      var pin = "2600";
      var result = searchInObject(data, "postcode", pin);
      console.log(result.state);
    
      pin = "2259";
      result = searchInObject(data, "postcode", pin);
      console.log(result.state);
    })()

    【讨论】:

      【解决方案5】:

      现在好了.. 你只是在要求我们帮你做作业 :) 还好我心情很好。

      首先获取一个正确的 JSON 字符串,并使用 JSON.parse 将其解析为一个对象。然后迭代这个对象,拆分邮政编码字符串,找到状态!

      var data = ......
      var resp = JSON.parse(data);
      
      function getStateByPostcode(postcode) {
        var state = "";
        for(var i in resp) {
          if(resp.hasOwnProperty(i)) {
             var postcodes = resp[i]['postcode'].split(',');
             if(postcodes.indexOf(postcode) !== -1) {
                 return resp[i]['state'];
             }
          }
        }
        return state;
      }
      

      【讨论】:

        猜你喜欢
        • 2019-09-21
        • 1970-01-01
        • 2012-05-04
        • 2011-02-21
        • 2013-12-26
        • 1970-01-01
        • 2016-01-08
        • 2011-12-18
        • 1970-01-01
        相关资源
        最近更新 更多