js中数组去除重复项目
js语法技巧:if(a>=5) alert(); 可以改写成下边语句: a>=5&&alert(); 在下文中会用到这种写法
// for循环删除后面重复的 速度最快,可用倒序计算可加快速度 var uniqueFor = function(arr) { for (var i = 0; i < arr.length - 1; i++) { var item = arr[i]; for(var j = i+1; j < arr.length; j++ ) { item === arr[j] && (arr.splice(j, 1), j--); } }; return arr; };
uniqueFor ([1,3,5,5,4,5,6,7,8,2,3])
这个方法效率最高,执行结果是先删除前边的,可以改下方法体倒序查询,就可以从后边开始删除了,请感兴趣的读者自己动手实验
//判断对象属性 var uniqueObject = function(arr) { var v, r = [], o = {}; for(var i = 0; (v = arr[i]) !== undefined; i++) { //v取出数组中的一个元素 //如果o的元素中不包含v属性, 则将元素存储到 r中,并设置o[]=true !o[v] && (r.push(v), o[v] = true); } return r; };
uniqueObject([1,3,5,5,4,5,6,7,8,2,3])
这个方法是通过将数组项目设置为o的属性后,查找属性中是否存在来进行筛选删除的,删除的是数组中靠后的重复项的,改下循环顺序可以删除靠前便的,不过最后还要颠倒一下数组
//数组过滤重复项filter var uniqueFilter = function(arr) { return arr.filter(function(elem, pos, self) { // 如果没有重复项,返回true,返回false的是有对应的elem会被删除 return self.indexOf(elem, pos + 1) === -1; }); };
uniqueFilter ([1,3,5,5,4,5,6,7,8,2,3])
这个方法是从前边的重复项开始删除的。如果要从后边开始删除,那么删除前线颠倒一下数组吧,删除完毕后再次颠倒回来。
上文中的代码块可以直接复制粘贴到chrome控制台执行查看结果
补充知识点:
array1.filter(callbackfn[, thisArg])
如果 callbackfn 参数不是函数对象,则将引发 TypeError 异常
参数 |
定义 |
---|---|
array1 |
必需。一个数组对象。 |
callbackfn |
必需。一个接受最多三个参数的函数。对于数组中的每个元素,filter 方法都会调用 callbackfn 函数一次。 |
thisArg |
可选。可在 callbackfn 函数中为其引用 this 关键字的对象。如果省略 thisArg,则 undefined 将用作 this 值。 |
内容来自MSDN https://msdn.microsoft.com/library/ff679973%28v=vs.94%29.aspx?f=255&MSPPError=-2147217396
当回调函数返回false时候,对应的项目会被删除