【问题标题】:Search zip-codes fast with jQuery使用 jQuery 快速搜索邮政编码
【发布时间】:2010-11-18 18:59:13
【问题描述】:

我有一个邮政编码列表,我需要使用 jQuery 搜索这些邮政编码。

我在 CSV 文件中有邮政编码,如下所示:

第2407章 第2425章 第2427章 第2446章 第2448章

列表相当大,超过 4000 个条目,邮政编码和对应的城市。

在浏览器中搜索列表最快的方法是什么? JSON?如果是这种情况,如何将列表转换为 JSON 或其他格式更好?

{ “2407”:“ELVERUM”, “2425”:“TRYSIL” }

有人可以告诉我最好的方法吗?

更新 仅使用 Regex 搜索加载的 CSV 文件是否可能/更快?

更新2 我正在寻找一个完全匹配的,只有当它有 4 个数字时才会搜索。

更新3 这是我的代码:

$('#postnummer').keyup(function(e) { 
    if($(this).val().length == 4) { 
    // Code to search the JSON for an exact match.      
    } 
});

$.getJSON("data.json",function(data){
});

谁能告诉我如何使用这个代码?

【问题讨论】:

    标签: javascript jquery json csv


    【解决方案1】:

    对于大型数据集,JSON 解析会很慢。我建议您改用简单的自定义格式,就像您拥有的那样:

    2407;ELVERUM
    2425;TRYSIL
    

    然后你可以像这样解析:

    var data = dataContent.split('\n').map(function(line){ return line.split(';'); })
    

    data 现在是一个由 2 元素数组组成的数组:第一个是邮政编码,第二个是名称。然后进行搜索,您可以执行以下操作:

    var foundItems = data.filter(function(p){ return p[0].indexOf(query) != -1; });
    

    这将为您提供一系列匹配项。如果您只对精确匹配感兴趣,则使用地图会更好。在这种情况下,您可以代替第一行来构建映射:

    var map = {};
    dataContent.split('\n').forEach(function(line){
        var p = line.split(';');
        map[p[0]] = p[1];
    });
    

    【讨论】:

    • 这(map 函数)不会比解析 JSON 本身慢(如果不是更慢)吗?此外,数组的问题是每次查找都是 O(n) 复杂度。
    • 它不起作用。 foundItems 数组只是空的。这是我的代码: $('#postnummer').keyup(function(e) { if($(this).val().length == 4) { var foundItems = data.filter(function(p){ return p [0].indexOf($(this).val()) == 0; }); console.log(foundItems); } });变种地图 = {}; $.ajax({ url: "tilbud5.csv", 缓存: false, 成功: function(dataContent){ data = dataContent.split('\n').map(function(line){ return line.split('; '); }) } });有什么想法吗?
    • Chetan - 你是对的,遍历数据行是 O(n),解析 JSON 也是如此。但在实践中,split() 比 eval() 快很多倍——用于解析 JSON 的函数,本质上是调用 Javascript 解释器。循环遍历数组来查找匹配比映射慢,但是如果你想进行部分匹配,那就是你必须要做的,而不是创建索引。但看起来 mofle 只是想要一个精确匹配,一张地图就足够了,这是我的最后一个例子。
    • 另外,请参阅这篇关于此主题的精彩文章:code.flickr.com/blog/2009/03/18/…
    • 您无法在解释器中完成所有这些拆分,比同一个解释器解析对象文字的速度更快。一次 split 调用可能比一次 eval 调用快,但听到您声称 4001 调用 split 比一次调用 eval 更快。使用拆分的唯一原因是您需要对结果进行增量解析。例如,如果您要解析如此多的邮政编码,您需要使用 setTimeout 来分解工作。在 Safari 上,我可以在大约 80 毫秒内解析具有大约 40,000 个属性的对象,所以我怀疑这是其中一种情况。
    【解决方案2】:

    在 4,000 个条目中,您应该使用您建议的格式将其解析为 JSON:

    {
         "2407": "ELVERUM",
         "2425": "TRYSIL"
    }
    

    如果您打算通过查找与邮政编码完全匹配的方式进行搜索,这也将为您提供最快的搜索时间。如果您在用户输入“24”的情况下执行某项操作,并且需要查找所有以“24”开头的邮政编码,那么您将需要一些更高级的操作。

    我不确定 jQuery 为解析 JSON 提供了哪些机制。通常完成的方式是使用 eval:

    var zips = eval("(" + data + ")");
    

    或者在现代浏览器上,您可以使用更快、更安全的 JSON 库。

    var zips = JSON.parse(data);
    

    【讨论】:

    • 好的,谢谢,但知道如何将 CSV 转换为 JSON 吗?如何通过解析的 JSON 进行搜索?
    • 需要注意的是,你必须通过转换CSV->JS数据。如果您执行 CSV->JSON->JS 数据,您应该意识到您正在向服务器添加额外的处理时间,以便客户端获取 JSON,这需要客户端上的最小转换开销。如果要使用此方法,则应在服务器端将 CSV 转换为 JSON。像这样的东西:tamlyn.org/2009/06/csv2json-convert-csv-to-json。否则,只有直接解析 CSV 才有意义。您可以使用其中一个 jQuery CSV 插件。 code.google.com/p/js-tables/wiki/CSV
    • 所以,如果你想走这条路,就需要使用服务器端语言。比如如果是 PHP,你会想要使用 fgetcsv(),然后 json_encode() 它。或者如果你想将其存储为静态文件,你可以使用上面的 tamlyn.org 链接,并将其保存为你想要的 json 文件。
    【解决方案3】:

    这是一个将您的 CSV 从 URL 转换为 JSON 的网页。您可以在计算机上本地使用它。使用 JQuery 和 CSVJSON 插件。 注意:此脚本是特定于给定 CSV 的快速破解。

    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
    <script src="http://js-tables.googlecode.com/svn/trunk/jquery.csv.min.js"></script>
    <script src="http://jquery-json.googlecode.com/files/jquery.json-1.3.min.js"></script>
    <script>
    jQuery(function($){
    
    $('#conv').click(function(){
        $.get($('#myurl').val(), function(data){
            var csvobj = {};
            var csvray = $.csv(';')(data);
            $(csvray).each(function(){
                csvobj[this[0]] = this[1];
            });
            $('#jsondata').val( "areacodes=" + $.toJSON(csvobj) );
        });
    });
    
    });
    </script>
    Url to CSV: <input type="text" id="myurl" value="tilbud5.csv" />
    <input type="button" id="conv" value="convert url to json" />
    <br/>
    <textarea id="jsondata" rows="1000" cols="100"></textarea>
    

    使用 JSON 数据,这只是一个例子:

    $('#postnummer').keyup(function(e) { 
        if($(this).val().length == 4) { 
            alert(areacodes[$(this).val()]);
        } 
    });
    
    $.getJSON("data.json?callback=?");
    

    【讨论】:

    • 太好了,这正是我想要的。但是有一个问题,当我用您的代码加载测试页时,浏览器在加载/解析 JSON 文件时锁定了大约 5 秒。有什么解决办法吗?这有点关键,因为没有人想要冻结浏览器;)
    • 将 areacodes= 放在 json 数据前面。例如:区域代码={"2407":"ELVEREM"}。然后使用 。或者你可以使用 $.getJSON("data.json?callback=?");
    • 您还需要删除 var areacodes = {};如果你这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多