js jquery数组去重
数组去重建议直接使用jquery的 $.unique(arr);方法,此外比较好的方法是本文中的unique3方法比较快用了一个hash表,就是所谓的空间换时间。本文还提供了很多其他写法,都是大同小异.
// $.unique(arr)推荐
var arr = [1, 'a', 2, 'b', 'b', 3, 'c', 'c', 'c']; document.write("jq-unique(): " + $.unique(arr) + "</br>"); // 1,a,2,b,3,c // 使用$.inArray(arr[i], new_arr),判断是否在新数组中 var jqUnique3 = function(arr) { var new_arr = []; // 定义一个空数组,用来存放最后筛选出来的元素 for(var i = 0; i < arr.length; i++) { if($.inArray(arr[i], new_arr) == -1) { // jQuery.inArray()函数用于在数组中搜索指定的值,并返回其索引值。如果数组中不存在该值,则返回 -1。 new_arr.push(arr[i]); // 不存在则插入到new_arr的最后 } } return new_arr; } var arr = [1, 'a', 2, 'b', 'b', 3, 'c', 'c', 'c']; document.write("jq-unique3(): " + jqUnique3(arr) + "</br>"); // 1,a,2,b,3,c // 设置标志位 Array.prototype.unique1 = function() { var new_arr = [this[0]]; // 构建一个新的数组存放结果 for(var i = 1; i < this.length; i++) { var repeat = false; for(var j = 0; j < new_arr.length; j++) { if(this[i] == new_arr[j]) { // for循环中每次从原数组中取出一个元素,用这个元素循环与结果数组对比 repeat = true; break; } } if(!repeat) { new_arr.push(this[i]); // 若结果数组中没有该元素,则存到结果数组中 } } return new_arr; } var arr = [1, 'a', 2, 'b', 'b', 3, 'c', 'c', 'c']; document.write("js-unique1(): " + arr.unique1() + "</br>"); // 1,a,2,b,3,c // 先排序再判断 // 有一定的局限性,因为在去重前进行了排序,所以最后返回的去重结果也是排序后的。如果要求不改变数组的顺序去重,那这种方法便不可取了。 Array.prototype.unique2 = function() { this.sort(); // 先将原数组进行排序 var new_arr = [this[0]]; for(var i = 1; i < this.length; i++) { if(this[i] !== new_arr[new_arr.length - 1]) { // 检查原数组中的第i个元素 与 结果数组中的最后一个元素是否相同,因为已经排序,所以重复元素会在相邻位置 new_arr.push(this[i]); // 如果不相同,则将该元素存入结果数组中 } } return new_arr; } var arr = [1, 'a', 2, 'b', 'b', 3, 'c', 'c', 'c']; document.write("js-unique2(): " + arr.unique2() + "</br>"); // 1,2,3,a,b,c // 使用Hash表,推荐 Array.prototype.unique3 = function() { var new_arr = []; // 创建一个新的数组存放结果 var json = {}; // 创建一个空对象 for(var i = 0; i < this.length; i++) { // for循环时,每次取出一个元素与对象进行对比,如果这个元素不重复,则把它存放到结果数组中,同时把这个元素的内容作为对象的一个属性,并赋值为1,存入到第2步建立的对象中。 if(!json[this[i]]) { new_arr.push(this[i]); json[this[i]] = true; } } return new_arr; } var arr = [1, 'a', 2, 'b', 'b', 3, 'c', 'c', 'c']; document.write("js-unique3(): " + arr.unique3() + "</br>"); // 1,a,2,b,3,c // indexOf 判断新数组中是否已存在 Array.prototype.unique4 = function() { var new_arr = []; //一个新的临时数组 for(var i = 0; i < this.length; i++) //遍历当前数组 { //如果当前数组的第i已经保存进了临时数组,那么跳过, //否则把当前项push到临时数组里面 if(new_arr.indexOf(this[i]) == -1) new_arr.push(this[i]); } return new_arr; } var arr = [1, 'a', 2, 'b', 'b', 3, 'c', 'c', 'c']; document.write("js-unique4(): " + arr.unique4() + "</br>"); // 1,a,2,b,3,c // indexOf 判断当前数组的第i项在当前数组中第一次出现的位置是不是i Array.prototype.unique5 = function() { var new_arr = [this[0]]; //结果数组 for(var i = 1; i < this.length; i++) //从第二项开始遍历 { //如果当前数组的第i项在当前数组中第一次出现的位置不是i, //那么表示第i项是重复的,忽略掉。否则存入结果数组 if(this.indexOf(this[i]) == i) new_arr.push(this[i]); } return new_arr; } var arr = [1, 'a', 2, 'b', 'b', 3, 'c', 'c', 'c']; document.write("js-unique5(): " + arr.unique5() + "</br>"); // 1,a,2,b,3,c