DotNet技术研究

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

表单中有一个数组article_coding[],里面有N个值,假设有下面三个值,B001,B002,B003有什么算法可以最快,高效地检查每个值是否有重复?

<form name="ucp_depotin" id="ucp_depotin" method="post">
<table id="article_list">
<tr>
<td><input type="text" name="article_coding[]" value="B001" readonly></td>
</tr>
<tr>
<td><input type="text" name="article_coding[]" value="B002" readonly></td>
</tr>
<tr>
<td><input type="text" name="article_coding[]" value="B001" readonly></td>
</tr>
</table>
</form>
 

普通方法:

Array.prototype.unique = function()
{
var a = {}; for(var i=0; i<this.length; i++)
{
if(typeof a[this[i]] == "undefined")
a[this[i]] = 1;
}
this.length = 0;
for(var i in a)
this[this.length] = i;
return this;
}

 

大容量数组的循环方面效率不尽人意,解决的方案就是:先把数组join()成一个大字符串,然后用正则表达式对这个大字符串进行匹配检索。
<SCRIPT LANGUAGE="JavaScript">
var txt = document.getElementById("txt");
var a = new Array();

function array_init()
{
var n = parseInt(document.getElementById("count").value);
a.length = 0;
for(var i=0; i<n; i++)
{
a[i] = Math.random() +"";
}
return "数组长度:"+ n;
}

function method_for()
{
var n = a.length;
var begin = new Date().getTime();
var b = new Array();
for(var i=0; i<n; i++)
{
if(a[i].indexOf("0.9999")==0)
{
b[b.length] = a[i];
}
}
return ("<br/>传统循环法耗时 "+ (new Date().getTime() - begin)
+" 毫秒!检索的结果:<strong title='"+ b.join("&#13;")
+"'>检索到 "+ b.length +" 个记录!</strong>");
}

function method_regexp()
{
var begin = new Date().getTime();
var b = new Array();
var s = a.join("\x0f");
var r = new RegExp().compile("0\\.9999\\d+", "g");
b = s.match(r); s = "";
return ("<br/>正则匹配法耗时 "+ (new Date().getTime() - begin)
+" 毫秒!检索的结果:<strong title='"+ b.join("&#13;")
+"'>检索到 "+ b.length +" 个记录!</strong>");
}
</SCRIPT>



其实,无论把数组连接成串时的效率有多高。但是对象数组是不能简单的join的,遍历总是少不了的
变换一下思维,就可以把复杂的问题简单化
<script>
a = [];
o = document.ucp_depotin['article_coding[]'];
for(i=0; i<o.length; i++) {
v = o[i].value;
if(! a[v]) a[v] = 0;
a[v]++;
if(a[v] > 1)
alert('有重复'+v+':'+a[v]);
}
</script>
 

posted on 2006-05-12 09:30  <林海>  阅读(648)  评论(0编辑  收藏  举报