当前位置:Gxlcms > JavaScript > javascript 删除数组中重复项(uniq)

javascript 删除数组中重复项(uniq)

时间:2021-07-01 10:21:17 帮助过:7人阅读

可以直接使用的代码:脚本之家修正版

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]
下面是进阶教程与说明,喜欢跟深入的朋友可以参考下。
首先让我们看下 YUI 是如何处理的:
代码如下:
  1. <br>var toObject = function(a) { <br>var o = {}; <br>for (var i = 0; i < a.length; i = i+1) { <br>o[a[i]] = true; <br>} <br>return o; <br>}; <br><br>var keys = function(o) { <br>var a=[], i; <br>for (i in o) { <br>if (lang.hasOwnProperty(o, i)) { // YUI的方法 <br>a.push(i); <br>} <br>} <br>return a; <br>}; <br><br>var uniq = function(a) { <br>return keys(toObject(a)); <br>}; <br> <br>详细分析,见同事 长天 的分享 《巧妙去除数组中的重复项》。 <br><br>自己使用的方式与 YUI 的方式十分相似,不过仅使用了一次循环便完成了删除数组中重复项,如下: <br><span><u></u></span> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br>var uniq = function (arr) { <br>var a = [], <br>o = {}, <br>i, <br>v, <br>len = arr.length; <br><br>if (len < 2) { <br>return arr; <br>} <br><br>for (i = 0; i < len; i++) { <br>v = arr[i]; <br>if (o[v] !== 1) { <br>a.push(v); <br>o[v] = 1; <br>} <br>} <br><br>return a; <br>} <br> <br>经过了简单的测试:自己使用的方式性能远远高于 YUI 的方式。 <br><br>抛砖引玉,欢迎大家提供更好的处理方法。 <br><br>2009年12月28日更新: <br><br>以上两种函数方法暂时都不能处理复杂的含有混合类型的数组(感谢 小猫 提出的疑问),如:[0,"0",1,"1",0]、["null",null]。 <br><br>对于能够约定类型为数字(注:要求非0开头的数字,小数除外)或字符串的数组,我们可以用改进后的函数方法(感谢 closurecache 提供的思路): <br><span><u></u></span> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br>var uniq = function (arr) { <br>var a = [], <br>o = {}, <br>i, <br>v, <br>cv, // corrected value <br>len = arr.length; <br><br>if (len < 2) { <br>return arr; <br>} <br><br>for (i = 0; i < len; i++) { <br>v = arr[i]; <br><br>/* closurecache 提供的函数中使用的是 cv = v + 0;, <br>* 这样就无法辨别类似[1, 10, "1", "10"]的数组, <br>* 因为运算后 => 1, 10, 10, 100,很明显,出现了重复的标示符。 <br>* 加前面就难道没问题吗? <br>* 有的:数组中不能出现类似01 、001,以 0 开头的数字, <br>* 但适用性比原先更广。 <br>*/ <br>cv = 0 + v; <br><br>if (!o[cv]) { <br>a.push(v); <br>o[cv] = true; <br>} <br>} <br><br>return a; <br>} <br> <br>如果大家想在此解题思路的基础上,更完美一点,推荐 Dexter.Yy 的方法,进行类型判断,给予唯一标示符,详见 评论 20 楼。 <br><br>没有最好,只有最合适的方式,其实使用 Array.indexOf() 的思路也是不错的选择,对于已经支持的浏览器直接用原生的 Array.indexOf() 方法,对于未支持的,我们增加 Array.indexOf() 方法,如下: <br><span><u></u></span> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br>if(!Array.prototype.indexOf) { <br>Array.prototype.indexOf = function (obj, fromIndex) { <br>if (fromIndex == null) { <br>fromIndex = 0; <br>} else if (fromIndex < 0) { <br>fromIndex = Math.max(0, this.length + fromIndex); <br>} <br><br>for (var i = fromIndex; i < this.length; i++) { <br>if (this[i] === obj) <br>return i; <br>} <br>return -1; <br>}; <br>} <br> <br>接下来,实现的过程就非常简单了。 <br><br>对于使用 Array.indexOf() 方法实现方案的优化提示:找到相同值时,从数组中移除,以减少下次遍历的量。</li><li> </li><li> </li></ol></pre></li></ol></pre></li></ol></pre>

人气教程排行