惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
A
About on SuperTechFans
Y
Y Combinator Blog
V
V2EX
Engineering at Meta
Engineering at Meta
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
V
Visual Studio Blog
博客园 - 叶小钗
博客园 - 聂微东
阮一峰的网络日志
阮一峰的网络日志
H
Help Net Security
小众软件
小众软件
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The GitHub Blog
The GitHub Blog
WordPress大学
WordPress大学
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
MongoDB | Blog
MongoDB | Blog
B
Blog
G
Google Developers Blog
J
Java Code Geeks
博客园 - 三生石上(FineUI控件)
IT之家
IT之家
N
Netflix TechBlog - Medium
腾讯CDC

博客园 - <林海>

高效取得图片数据GetImgByte,返回结果数组和像素一一对应 JavaScript中Array 对象相关的几个方法 Javascript总结 sql时间格式转换问题 Transact SQL 常用语句以及函数 C#读取硬盘序列号 C#注册表操作类 Windows API函数大全 windows运行命令详解 Javascript String 对象增强 VS.NET 2003 命名规范 .NET Remoting 实现分布式数据库查询 ASP.NET细节 JS刷新页面问题 javascript 列出本地某个目录下所有的文件 JavaScript每隔一段时间重新加载一下这个JS文件 Javascript 构造endwith方法 用javascript判断某文件是否存在于本地机器的某路径下 JavaScript语法——style.display 属性
JavaScript高效地检查每个值是否有重复
<林海> · 2006-05-12 · via 博客园 - <林海>

表单中有一个数组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>