Javascript 使用jQuery快速搜索邮政编码
我有一个使用jQuery搜索的邮政编码列表 我在CSV文件中有如下邮政编码: 2407;ELVERUM 2425;TRYSIL 2427;TRYSIL 2446;ENGERDAL 2448;ENGERDALJavascript 使用jQuery快速搜索邮政编码,javascript,jquery,json,csv,Javascript,Jquery,Json,Csv,我有一个使用jQuery搜索的邮政编码列表 我在CSV文件中有如下邮政编码: 2407;ELVERUM 2425;TRYSIL 2427;TRYSIL 2446;ENGERDAL 2448;ENGERDAL 有人能告诉我如何使用这段代码吗?对于大型数据集,JSON解析会很慢。我建议您改为使用简单的自定义格式,就像您使用的格式一样: 2407;ELVERUM 2425;TRYSIL 然后您可以像这样解析: var data = dataContent.split('\n').map(functi
有人能告诉我如何使用这段代码吗?对于大型数据集,JSON解析会很慢。我建议您改为使用简单的自定义格式,就像您使用的格式一样:
2407;ELVERUM
2425;TRYSIL
然后您可以像这样解析:
var data = dataContent.split('\n').map(function(line){ return line.split(';'); })
其中,数据现在是一个由两个元素组成的数组:第一个是zipcode,第二个是名称。然后,要进行搜索,您可以执行以下操作:
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];
});
对于大型数据集,JSON解析会很慢。我建议您改为使用简单的自定义格式,就像您使用的格式一样:
2407;ELVERUM
2425;TRYSIL
然后您可以像这样解析:
var data = dataContent.split('\n').map(function(line){ return line.split(';'); })
其中,数据现在是一个由两个元素组成的数组:第一个是zipcode,第二个是名称。然后,要进行搜索,您可以执行以下操作:
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];
});
对于4000个条目,您应该使用您建议的格式将其解析为JSON:
{
"2407": "ELVERUM",
"2425": "TRYSIL"
}
如果您计划通过查找zipcode的精确匹配来搜索,这也将为您提供最快的搜索时间。如果您在用户键入“24”时执行某些操作,并且需要查找所有以“24”开头的Zipcode,那么您将需要更高级的操作
我不确定jQuery为解析JSON提供了什么机制。通常的做法是使用eval:
var zips = eval("(" + data + ")");
或者在现代浏览器上,您可以使用更快、更安全的JSON库
var zips = JSON.parse(data);
对于4000个条目,您应该使用您建议的格式将其解析为JSON:
{
"2407": "ELVERUM",
"2425": "TRYSIL"
}
如果您计划通过查找zipcode的精确匹配来搜索,这也将为您提供最快的搜索时间。如果您在用户键入“24”时执行某些操作,并且需要查找所有以“24”开头的Zipcode,那么您将需要更高级的操作
我不确定jQuery为解析JSON提供了什么机制。通常的做法是使用eval:
var zips = eval("(" + data + ")");
或者在现代浏览器上,您可以使用更快、更安全的JSON库
var zips = JSON.parse(data);
这是一个将CSV从URL转换为JSON的网页。您可以在计算机上本地使用它。使用JQuery和和和插件。 注意:此脚本是特定于给定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>
这是一个将CSV从URL转换为JSON的网页。您可以在计算机上本地使用它。使用JQuery和和和插件。 注意:此脚本是特定于给定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本身一样慢(如果不是更多的话)吗?另外,数组的问题是,每次查找都是O(n)复杂度的,不起作用。foundItems数组只是空的。这是我的代码:$('#postnummer').keyup(函数(e){if($(this.val().length==4){var foundItems=data.filter(函数(p){return p[0].indexOf($(this.val())==0;});console.log(foundItems);};变量映射={};$。ajax({url:“tilbud5.csv”,cache:false,success:function(dataContent){data=dataContent.split('\n').map(function(line){return line.split(';');}}});有什么想法吗?Chetan-你是对的,在数据行中循环是O(n),解析JSON也是O(n)。但在实践中,split()比eval()快很多倍,eval()是用于解析JSON的函数,本质上是调用Javascript解释器。在数组中循环查找匹配比映射要慢,但如果要进行部分匹配,除了创建索引外,这就是必须做的。但看起来mofle只是想要一个精确的匹配,映射就足够了,这是我的最后一个例子。另外,请看这篇关于这个主题的伟大文章:在一个解释器中,你不能以比同一个解释器解析对象文字更快的速度完成所有这些拆分。一次调用split可能比一次调用eval快,但听说您声称4001次调用split比一次调用eval快。使用拆分的唯一原因是如果需要对结果进行增量解析。例如,如果您正在解析太多的邮政编码,需要使用setTimeout来中断工作。在Safari上,我可以在大约80毫秒内解析一个具有40000个属性的对象,所以我怀疑这是其中之一。这(映射函数)不是比解析JSON本身慢(如果不是更多的话)吗?另外,数组的问题是,每次查找都是O(n)复杂度的,不起作用。foundItems数组只是空的。这是我的代码:$('#postnummer').keyup(函数(e){if($(this.val().length==4){var foundItems=data.filter(函数(p){return p[0].indexOf($(this.val())==0;});console.log(foundItems);};变量映射={};$。ajax({url:“tilbud5.csv”,cache:false,success:function(dataContent){data=dataContent.split('\n').map(function(line){return line.split(';');}}});有什么想法吗?Chetan-你是对的,在数据行中循环是O(n),解析JSON也是O(n)。但在实践中,split()比eval()快很多倍,eval()是用于解析JSON的函数,本质上是调用Javascript解释器。在数组中循环查找匹配比映射要慢,但如果要进行部分匹配,除了创建索引外,这就是必须做的。但看起来mofle只是想要一个精确的匹配,映射就足够了,这是我的最后一个例子。另外,请看这篇关于这个主题的伟大文章:在一个解释器中,你不能以比同一个解释器解析对象文字更快的速度完成所有这些拆分。一个split调用可能比一个eval调用快,但听说您声称4001个split调用快